2011-02-24 82 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