2011-02-24 21 views
0

デリゲートが何をしているのか、なぜそれを使用するのか、それをどのように実装するのか、まともな考えがあり、私は自分のプロジェクトの1つでそれを実装しようとしています。私が解決しようとしている問題は、Controllerオブジェクトをネットワークアクセスクラスから切り離すことです。この文脈では、アイデアは私の頭の中で少し乱雑になります。Objective-Cの代理人クエリ

NetworkAccessClassがControllerオブジェクトのヘルパーとして機能しているため、NetworkAccessClassがControllerオブジェクトのデリゲートである必要があります。以下は明らかにそれを行うための正しい方法であるので、しかし、逆の方法で動作するようです:私のFirstViewController.h

NetworkaccessClass.h

@protocol NetworkAccessDelegate 
-(void) requestSucceded:(NSData *) data 
-(void) requestFailed:(int) responseCode; 
@end 
@interface NetworkAccessClass : NSObject 
{ 
    id<NetworkAccessDelegate> networkDelegate; 
} 

@property(nonatomic, assign) id networkDelegate; 

-(void) initWithDelegate:(id) delegate; // 

@end 

NetworkAccessClass.m

@implementation 
@synthesize networkDelegate 

-(void) initWithParams:(id) delegate 
{ 
    networkDelegate = delegate; 
    // Assign GET/POST vals, create request etc 
    [request startAsynchronous];  
} 

-(void) requestSucceded:(ASIHTTPRequest *) request 
{ 
    if([networkDelegate respondsToSelector:@selector(requestSucceded:)]) { 
     // Send the data to the controller object for it to use 
     ... 
    } 
} 

-(void) requestFailed:(ASIHTTPRequest *) request 
{ 
    // Same as above. Send to request failed. 
} 

@end 

そして最後に

#import "NetworkAccessClass.h" 
@interface FirstViewController<NetworkAccessDelegate> 
{ 

} 
-(void) requestSucceded:(NSData *) data; 
-(void) requestFailed:(int) responseCode; 
@end 

SecondViewController.hなど。

これは私のネットワーククラスからの私のコントローラを分離していますが、私はこの場合のコントローラは、他の方法ラウンド代表者やヘルパーメソッドへのネットワーククラスとして機能していないので、それは間違っだと感じざるを得ません。私は何か基本的なものを欠いていますそれともこれはどうですか?

ありがとう、
Teja。

答えて

4

代表者は「ヘルパーメソッド」ではありません。何かが起こったときに通知を受けるオブジェクトと考えることができます。 (これらは「通知」と混同しないでください - これはまったく別のものです)。この場合、ネットワーククラスはそれを処理し、インスタンス化して実行したView Controllerのデリゲートメソッドを呼び出してコンテンツを報告しますその応答のビューコントローラへの応答。コントローラは、おそらくネットワークコネクタが取得したデータでビューを更新します。古典的なデリゲートパターン。

+0

ええと私は理論を得ていますが、あなたが英語の言葉で見れば、タスクを誰かに割り当てているだけです。ヘルパーメソッドのようなもので、混乱の原因になります。あなたが提供したアナロジーは役に立ちます。 –

+0

例のように、結果が関心のある場所にローカルで処理された結果、コア "作業をしていること"がUIViewのどこを知る必要はありませんデータを入れてください。デリゲートパターンは完全なデカップリングを可能にします。プロセスを実行するものは、その結果の処理を、その結果が使用されたい場所に近いオブジェクトに「委譲」(動詞)します。 –