2011-02-24 79 views
0

因此,我對代理人的工作,爲什麼使用它,如何實現等有了一個體面的想法,並且正在努力在我的一個項目中實現它。我試圖解決的問題是從我的網絡訪問類解耦我的控制器對象。在這種情況下,這些想法在我的腦海中變得雜亂無章。委託人在目標中查詢 - C

我以某種方式直觀地感覺到NetworkAccessClass應該是Controller對象的委託,因爲NetworkAccessClass充當Controller對象的幫助器。但似乎在相反的方式工作,因爲以下顯然是做了正確的方式:

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 
FirstViewController.h

最後

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

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

和一樣等等。

雖然這從我的網絡類脫鉤我的控制器,我不禁覺得這是錯誤因爲在這種情況下,控制器作爲委託或輔助方法網絡類,而不是倒過來。我缺少一些基本的東西嗎?或者這是怎麼回事?

謝謝,
Teja。

回答

4

代表不是「輔助方法」。把它們想象成在事情發生時得到通知的對象。 (儘管不要將它們與「通知」混淆 - 這完全是另一回事)。在這種情況下,你的網絡類就是它的東西,然後在實例化和觸發的View Controller上調用它的委託方法,以報告內容對視圖控制器的響應。據推測,控制器將使用網絡連接器獲得的數據更新視圖。經典的代表模式,就在那裏。

+0

嗯我得到的理論,但委託,如果你只是把它看作一個英語單詞,只是分配一個任務給某人/事物,有點像助手方法,這會導致混淆。雖然你提供的比喻有幫助。 – 2011-02-24 20:29:02

+0

好吧,就像在這個例子中一樣,讓進程的結果在本地處理到感興趣的地方,這樣核心「做這件事的東西」就不必知道UIView中的哪個位置把數據。委託模式允許完全解耦。這個過程能夠「將」結果的處理「委託」(動詞)到接近那些結果想要使用的對象。 – 2011-02-24 20:42:35