同时使用多个 NSURLConnections - 最佳实践
Posted
技术标签:
【中文标题】同时使用多个 NSURLConnections - 最佳实践【英文标题】:Using multiple NSURLConnections at the same time - best practices 【发布时间】:2010-11-07 05:32:45 【问题描述】:在我的 iPhone 应用程序中,我已经能够正确使用 NSURLConnection 从 URL 下载数据。我只是将delegate
设置为我的UIView,并确保我设置了UIView 来回答正确的委托功能,例如-connection:didReceiveResponse:
。但是,如果我有许多 NSURLConnections(对于类似类型的请求或多种请求),它会变得混乱,因为诸如 didReceiveRequest
之类的委托函数不会区分不同的请求。异步请求的优点是您应该能够一次执行多个请求,而不会阻塞主线程。 如何同时使用多个 NSURLConnection 请求的最佳做法是什么?
【问题讨论】:
重复***.com/questions/203294/… 【参考方案1】:我更喜欢将它们包装在具有所有每个连接/调用状态信息的更高级别的对象中(如ImageDownloader
或SomeWebServiceCall
)。我通常会为这些对象创建一个委托,以便调用者在操作成功或失败时获得更具体的回调。
【讨论】:
【参考方案2】:也许看看ASIHTTPRequest,而不是NSURLConnection。 ASIHTTPRequest 使这项工作变得非常简单。
【讨论】:
【参考方案3】:在这种情况下,我会说 NSOperation 是您最好的选择。 ASIHTTPRequest 基于 NSOperation 并允许您将每个请求作为一个操作来处理,该操作充当其自己的 NSURLConnection 的委托。
您必须在这里小心,因为默认情况下 NSOperations 在单独的线程上运行,但是一些 API,例如这个,需要在主线程上执行。如果您检查 ASIHTTPRequest 的源代码,您会注意到他们有一些基础设施来确保在主线程上调用委托方法。
【讨论】:
【参考方案4】:为每个 NSURLConnection 和 NSMutableData 创建一个实例变量。您的所有委托方法都将 NSURLConnection 对象作为参数,因此您可以像这样匹配它们:
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
if (connection == aConnection)
// Do something with the data for aConnection
else if (connection == otherConnection)
// Do something with the data for otherConnection
这仍将您限制为每个实例变量一个连接,因此它不适合,例如,需要加载的每一行都有图像的表格视图。
【讨论】:
看日期,问题5年多了。如今NSURLSession
是最先进的。
我不知道为什么这会出现在我的提要中。我没有看日期。以上是关于同时使用多个 NSURLConnections - 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
NSURLConnection 是不是利用了 NSURLCache?