使用选择器进行回调?

问题描述:

我想我应该使用选择器(甚至是不同的范例),但即使在TF'RM之后,我无法弄清楚我应该做什么。这一切都与回调从委托使用选择器进行回调?

我有我的主要模型对象:

@implementation Model 
    @synthesize myConnection; // which is an NSURLConnection 
    ... 
    -(void)someMethod{ 
    MyConnectionDelegate *mcd = [[MyConnectionDelegate alloc]initWithCallingObject:self]; 
    myConnection = [[NSURLConnection alloc] initWithRequest:requestForToken delegate:mcd]; 
... 
} 
-(void)didGetCalledBack:(NSArray *)resultArray{ 
    NSLog(@"got the callback"); 
} 

,然后在我的委托:

@implementation MyConnectionDelegate 
@synthesize callingObject; // which is of type id 
@synthesize resultArray; // NSArray 
-(id)initWithCallingObject:(id)caller{ 
    ...//std [self init] block 
    self.callingObject = caller; 
    return self; 
... 
} 


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
... 
} 
//and all the other NSURLConnection delegate methods 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    ... 
    // finish building array of results into self.resultArray 
    [self.callingObject didGetCalledBack:self.resultArray]; 
} 

所以...... 1)我觉得我应该使用选择器,还是其他的东西,而不是硬编码调用者(委托人?)需要实现的事实 - didGetCalledBack: 对不对?如果是这样,怎么样? (以及为什么,除了清洁)

2)或者是我的整个实现错误的方式我试图使用NSURLConnection代表回拨给委托人的回调错误?

我已经看过苹果示例代码等,但没有看到有什么比delegate:self以外的任何东西。也许我应该有委托:NSURLConnection也是我自己,但我做了很多连接,如果我做委托:自我我的委托方法(如 - didReceiveData :)变成if (connection ==connection1){类型代码的大混乱。

感谢, 理查德

+0

我认为从Model建立连接,但是在其他地方实现委托会不必要地将相关代码在不同的类中传播,这使得难以维护并难以理解。 如果你有很多代表,那么你的模型可能做的太多了,即属于其他地方的东西*完全*。 – Eiko 2010-07-02 00:15:36

+0

我根本不反对,但如果我不在其他地方使用委托,那么我的5-6 REST调用每个返回的XML都会以我的6个NSXMLParser委托方法和5-6个NSURLConnection委托方法中的大if/elseif语句结束。这就是我想要清理的东西。你对“完全在别的地方”有什么特别的想法吗? – richard 2010-07-02 17:07:03

+0

为什么它必须以大if/elseif块结束?你不能抽象吗?就像你现在所拥有的那样,你只是将这种复杂性移到其他地方。 – 2010-07-03 16:21:10

我想我应该用选择,或其他的东西,而不是硬编码调用者(委托人?)需要实现-didGetCalledBack的事实:对吗?如果是这样,怎么样? (以及为什么,除了清洁)

你在做什么没有错。您可能想要考虑为调用对象声明协议,例如

@protocol CallingObject <NSObject> 
    -(void) didGetCallBack: (NSArray*) resultArray; 
@end 

然后

@interface Model : NSObject <CallingObject> // ... 

@interface MyConnectionDelegate : NSObject 
{ 
    // ... 
} 

-(id) initWithCallingObject: (id<CallingObject>) calller; 

// ... 

@end 

这将会给你一些编译时检查调用对象实现所需的方法(S)。

+0

啊,是的,这是一个好主意 - 我想知道如何摆脱编译警告。 (现在我已经认识到警告是非常糟糕的,不像以前的语言,我曾经在那里警告只是糟糕的;)) – richard 2010-07-02 16:24:36

也许我应该代表:太自我为NSURLConnection,但我在做很多的连接,如果我做我的delegate:self委托方法(如-didReceiveData:)成为一个大混乱if (connection ==connection1){类型代码。

然后不要使用显式比较 - 使用容器或类似的抽象来对不同的连接作出反应。

E.g.使用不同的控制连接的效果,请使用映射的字典从NSURLConnection s到这些控件,以便执行以下操作:

if  (connection == connection1) [obj1 doStuff]; 
else if (connection == connection2) [obj2 doStuff]; 
// ... 

变为:

[[connectionClients objectForKey:connection] doStuff];