0

对于我正在开发的 iOS 应用程序,我目前正在编写一个单例类来处理对服务器的异步请求。这是其中一种方法的示例-

- (void)registerUser:(CBCUserRegistration *)userRegistration delegate:(id)<CBCUserRegistrationDelegate>delegate;

在这个方法中,一个 NSURLConnection 被创建并发送一个异步请求。此时,我需要一种将委托对象绑定到 NSURLConnection 的方法,所以当

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

被调用,我知道要通知哪个代表。因为请求是异步的,所以任何时候都可能有多个请求。我最初的想法是使用 NSMutableDictionary,将 NSURLConnection 设置为键,将委托设置为值,但是键被复制了,所以这是不行的。谁能建议另一种方法来跟踪这个?

提前致谢。

4

2 回答 2

2

避免为此使用 NSDictionary。而是采用面向对象的方法:

编写一个MyConnection实现所需NSURLConnectionDelegate回调并具有该类型的属性/ivar 的id<CBCUserRegistrationDelegate>类。添加一个start方法来MyConnection创建一个NSURLConnection,为自己分配该连接的委托,然后启动它。MyConnection现在您可以为您执行的每个 URL 请求创建一个实例。MyConnection保持CBCUserRegistrationDelegate并转发它从 . 收到的结果NSURLConnection

但是,在这里使用委托有点过时。改用块,特别是如果您的项目使用 ARC。NSURLConnection提供了一种方便的方法来执行异步请求:[NSURLConnection sendAsynchronousRequest:queue:completionHandler:].

例如:

- (void)registerUser:(CBCUserRegistration *)userRegistration delegate:(id<CBCUserRegistrationDelegate>)delegate
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://mysite.com/register"]];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        [delegate processRegistrationResponseData:data];
    }];
}
于 2012-09-26T19:20:45.690 回答
0

使用设置为 NSURLConnection 的地址的 NSNumber 作为键,然后您可以设置另一个字典作为键的对象。你可以给它起一个名字等,记录要通知的对象等。只要记住在释放 NSURLConnection 时删除它。

于 2012-09-26T19:19:06.467 回答