带有 NSURLConnection 的网络管理器

Posted

技术标签:

【中文标题】带有 NSURLConnection 的网络管理器【英文标题】:Network manager with NSURLConnection 【发布时间】:2011-05-18 17:43:53 【问题描述】:

我正在尝试使用 NSUrlConnections 创建类似于网络管理器的东西。 为此,我希望能够发送多个请求,但我也希望能够在响应到达时识别发出请求的客户端(委托)。 我创建了一个这样的 NSDictionary:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:SERVER_TIMEOUT];
....
[clients setObject:client forKey:connection];

在“- (void)connectionDidFinishLoading:(NSURLConnection *)connection”中我有这样的东西:

client = (id<RTANetworkDelegate>)[clients objectForKey:connection];
[clients removeObjectForKey:connection];

网络管理器是所有连接的代理,我进行一些预处理,然后将(解析的)响应发送给正确的代理,该代理首先发送了请求。

不幸的是,NSMutableURLRequest 似乎无法设置为字典中的键,因为它没有 copyWithZone 方法,我收到错误:

-[NSURLConnection copyWithZone:]: 无法识别的选择器发送到 实例

任何帮助将不胜感激! 谢谢!

========================================

[编辑]同时我已经找到了这个:

http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/

这似乎解决了我的问题。但我仍然不知道这是否是最好的解决方案。我想我会在这里发布它,因为它也可能对其他人有所帮助。

【问题讨论】:

【参考方案1】:

您可以使用连接对象的-hash 值作为键:

[clients setObject:client forKey:[connection hash]];

我会远离实际的 URL 或任何类似的东西,因为两个请求可能具有相同的 URL。

【讨论】:

如果两个连接相同(但可能从云中获取不同的数据)会发生什么,-hash 不会为它们返回相同的值吗?根据 NSObject 协议的定义,-hash 应该为它们两者返回相同的值“如果两个对象相等(由 isEqual: 方法确定),它们必须具有相同的哈希值。”我假设 isEqual: 将为两个看起来相似的 NSURLConnections 返回 YES。 这两个 NSURLConnection 会不同(它们会有不同的指针),所以 isEqual 会返回 false 并且哈希值也会不同。 为我解决这个问题干杯,我怀疑是这样,但不知何故我假设 isEqual: 比较内容而不是指针。

以上是关于带有 NSURLConnection 的网络管理器的主要内容,如果未能解决你的问题,请参考以下文章

带有异步NSURLConnection调用的MBProgressHUD

iOS网络开发使用NSURLConnection

iOS开发网络篇—NSURLConnection基本使用

iOS开发网络篇--NSURLConnection

iOS开发网络篇—NSURLConnection基本使用

使用 NSURLConnection 发送 POST 请求