2011-08-01 23 views
0

私はUIViewControllerの中にUITableViewを持っています。このビューコントローラでは、インターネットからダウンロードしたデータを表示したいと考えています。したがって、このために、私は次の操作を行うことになっているOfficesParserと呼ばれるヘルパークラスを作成しました:Objective-C - NSObjectサブクラスからUIViewControllerにデータを送信する

  1. を終了したらJSONパーサ
  2. とデータは、送信ASIHTTPRequest
  3. プロセスでインターネットからデータをダウンロードデータバック私のビューコントローラ私はそうのよう-viewDidLoadで私のヘルパークラスをINGのalloc INGとinitだで私のビューコントローラ

へ:

self.officesParser = [[[OfficesParser alloc] init] autorelease]; //officesParser is a retained property 

はその後-viewWillAppear:に私はそうのようなダウンロードプロセスを開始しますofficesParserオブジェクトのメソッドを呼び出す:私のヘルパークラスで

[self.officesParser download]; 

OfficesParserASIHTTPRequestがキューを示しますデリゲートメソッドを持っていますダウンロードが完了しました。だからこのメソッドから、私のビューコントローラにデータを送信したい。私はこれが仕事と思うだろうが、それはしませんでした:

- (void)queueFinished:(ASINetworkQueue *)queue { 

    NSArray *offices = [self offices]; 
    OfficesViewController *ovc = [[OfficesViewController alloc] init]; 
    [ovc setOffices:offices]; 

} 

このコードを念頭に置いて、どのように私は適切なコードでやろうとしているものを達成でしょうか?

答えて

3

delegates and protocolsをご覧ください。彼らはあなたが探しているものです。参照を保持しなくてもクラスをコミュニケーションさせることができます。 Hereがその説明です。

+0

のようなあなたのOfficesParserを作成しますか? –

+0

保持サイクルの使用委任を避けるため、これが簡単な方法です。 – Joe

+0

ハックではありません。これは、あなたがしようとしていることを正確に行うために設計されたアーキテクチャパターンです。参照は必ずしも最良の方法とは限りません。 – MishieMoo

0

あなたのコード:

OfficesViewController *ovc = [[OfficesViewController alloc] init]; 

OfficesViewControllerの新しいインスタンスプロパティを作成します。新しいインスタンスであるため、ダウンロードおよび解析プロセスの後にトリガーしたOfficesViewControllerへの接続はありません。 OfficesViewControllerOfficesParserをcomunicateできるようにするには、OfficesParserの修正されたinitメソッドを作成し、OfficesViewControllerへの週ポインタを許可します。

@interface OfficesParser() 

@property(nonatomic,assign)OfficesViewController *ovc; 

@end 

@implementation OfficesParser 

@synthesize ovc; 

-(id)initWithDelegate:(OfficesViewController*)delegate{ 
    ovc = delegate; 
    return [self init]; 
} 

これで、ovcデリゲートにアクセスできます。

- (void)queueFinished:(ASINetworkQueue *)queue { 
    NSArray *offices = [self offices]; 
    [ovc setOffices:offices]; 
} 

最後だから、これを行うには簡単なハック/コードはありませんその

self.officesParser = [[OfficesParser alloc] initWithDelegate: self]; 
+0

ありがとう!私はこれを試してみよう!プロパティをretainと宣言してはならず、実際にはPVCプロパティを使用していますか? (少なくとも私はプロパティ呼び出しを見ることができません) –

+0

それは週参照であるので、割り当てとして宣言されています。 'ovc'は' queueFinished'メソッド '[ovc setOffices:offices];で使用されます。 – Cyprian

+0

弱い参照を使用して保持サイクルを回避します。より多くのaobut保持サイクルを見つけるにはこの答えを読んでください[http://stackoverflow.com/questions/791322/retain-cycles-why-is-that-such-a-bad-thing/791372#791372](http:// stackoverflow.com/questions/791322/retain-cycles-why-is-that-such-a-bad-thing/791372#791372) – Cyprian

関連する問題