我认为我应该使用选择器(甚至是不同的范例),但即使在R'ing TFM之后,我也无法弄清楚我应该做什么。这一切都与代表的回调相关
我有我的主要Model对象:
@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
的委托回到委托人的回调错误?
我看过Apple样本代码等,但除了delegate:self
之外我没见过任何东西。也许我应该有委托:自我也是NSURLConnection
,但我正在建立很多联系,如果我委托:自我我的委托方法(比如 - didReceiveData
:)成为{if (connection ==connection1){
的大混乱1}}类型代码。
感谢, 理查德
答案 0 :(得分:2)
我认为我应该使用选择器或其他东西,而不是硬编码调用者(委托人?)需要实现-didGetCalledBack的事实:对吗?如果是这样,怎么样? (为什么,除了清洁)
你在做什么没有错。您可能需要考虑为调用对象声明协议,例如
@protocol CallingObject <NSObject>
-(void) didGetCallBack: (NSArray*) resultArray;
@end
然后
@interface Model : NSObject <CallingObject> // ...
和
@interface MyConnectionDelegate : NSObject
{
// ...
}
-(id) initWithCallingObject: (id<CallingObject>) calller;
// ...
@end
这将为您提供一些编译时间,以检查调用对象是否实现了所需的方法。
答案 1 :(得分:1)
也许我应该有委托:自我也是
NSURLConnection
,但我正在建立很多联系,如果我delegate:self
我的委托方法(如-didReceiveData:
)变得很乱if (connection ==connection1){
类型代码。
然后不要使用显式比较 - 使用容器或类似的抽象来对不同的连接做出反应。
E.g。要使用不同控件的连接结果,请使用从NSURLConnection
映射到这些控件的字典,如下所示:
if (connection == connection1) [obj1 doStuff];
else if (connection == connection2) [obj2 doStuff];
// ...
变为:
[[connectionClients objectForKey:connection] doStuff];