objective-c - NSOperation 与异步 NSURLConnection

标签 objective-c cocoa-touch nsurlconnection nsoperation nsoperationqueue

我有一个运行常规服务器同步进程的 iPad 应用程序 - 它每 10 秒左右运行一次。同步过程会下载插入到基于 CoreData SQL 的存储中的记录。有时,正在处理的记录数量可能会达到数百或数千。

当前同步过程基于主线程触发的Asynchronous NSURLConnection。一旦async调用收集了所有NSData,主线程就会在后台触发NSOperation来解析NSData 并将其插入数据库。

因此,NSURLConnection 是异步运行的,而数据库插入是在后台 NSOperation 中运行的。但是,NSURLConnectionNSOperation 的编排是在主线程中完成的。鉴于正在下载大量数据,我认为即使主线程上的少量编排也可能会影响我的 UI 响应能力。

因此,我正在考虑将代码重构为单个后台 NSOperation 并将 NSURLConnection 制作为同步调用。然后,单个 NSOperation 将同步下载 NSData 并管理数据库插入。

在我开始进行相当大的重构之前,我会对人们对这是否是一个好的决定的看法感兴趣。

使用当前机制,我注意到用户界面中偶尔会出现一些犹豫。通过将整个机制放在后台 NSOperation 中,我希望 UI 能够保持响应。

任何智慧之言都将非常感激。

谢谢。

最佳答案

我不建议切换到同步连接。异步连接使用更少的内存,让您可以更好地控制下载过程。为了避免 UI 卡住,我会尝试仅在 NSURLConnection 委托(delegate)方法内强制进行后台处理,如下所示:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [self.mutableData appendData:data];
    });
}

编辑: 正如 @jrturton 在注释中所述,您可以为 NSURLConnection 委托(delegate)方法指定队列。使用setDelegateQueue:方法(iOS 5.0+)。

关于objective-c - NSOperation 与异步 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15657452/

相关文章:

objective-c - 从存储在单例中的数组中删除对象

objective-c - numberOfSectionsInTableView 之后 UITableViewController 崩溃

iphone - 如何以编程方式模拟 iPhone 的 Home 和 Power 按钮?

ios - NSURLConnection 下载大型 zip 文件

ios - SGActionView 网格菜单

objective-c - 使用 Objective-C 根据框架在 Xcode 中的可用性有条件地链接框架的最佳方法

objective-c - 使用 CFDictionaryRef 和 A​​BMutableMultiValueRef 的无法解释的泄漏

objective-c - 如果在循环中插入对象,应该多久调用一次 NSManagedObjectContext 保存?

ios - 如何在将 JSON 数据流式传输到 NSURLConnection 时处理分块

ios - 2013年的ASIHTTPRequest和AFNetworking。该选择什么?