使用选择器进行回调?

时间:2010-07-02 00:05:20

标签: iphone objective-c delegates

我认为我应该使用选择器(甚至是不同的范例),但即使在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}}类型代码。

感谢, 理查德

2 个答案:

答案 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];