使用选择器进行回调?
我想我应该使用选择器(甚至是不同的范例),但即使在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){
类型代码的大混乱。
感谢, 理查德
我想我应该用选择,或其他的东西,而不是硬编码调用者(委托人?)需要实现-didGetCalledBack的事实:对吗?如果是这样,怎么样? (以及为什么,除了清洁)
你在做什么没有错。您可能想要考虑为调用对象声明协议,例如
@protocol CallingObject <NSObject>
-(void) didGetCallBack: (NSArray*) resultArray;
@end
然后
@interface Model : NSObject <CallingObject> // ...
和
@interface MyConnectionDelegate : NSObject
{
// ...
}
-(id) initWithCallingObject: (id<CallingObject>) calller;
// ...
@end
这将会给你一些编译时检查调用对象实现所需的方法(S)。
啊,是的,这是一个好主意 - 我想知道如何摆脱编译警告。 (现在我已经认识到警告是非常糟糕的,不像以前的语言,我曾经在那里警告只是糟糕的;)) – 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];
我认为从Model建立连接,但是在其他地方实现委托会不必要地将相关代码在不同的类中传播,这使得难以维护并难以理解。 如果你有很多代表,那么你的模型可能做的太多了,即属于其他地方的东西*完全*。 – Eiko 2010-07-02 00:15:36
我根本不反对,但如果我不在其他地方使用委托,那么我的5-6 REST调用每个返回的XML都会以我的6个NSXMLParser委托方法和5-6个NSURLConnection委托方法中的大if/elseif语句结束。这就是我想要清理的东西。你对“完全在别的地方”有什么特别的想法吗? – richard 2010-07-02 17:07:03
为什么它必须以大if/elseif块结束?你不能抽象吗?就像你现在所拥有的那样,你只是将这种复杂性移到其他地方。 – 2010-07-03 16:21:10