我有一个运行常规服务器同步进程的 iPad 应用程序 - 它每 10 秒左右运行一次。同步过程会下载插入到基于 CoreData SQL 的存储中的记录。有时,正在处理的记录数量可能会达到数百或数千。
当前同步过程基于主线程触发的Asynchronous NSURLConnection
。一旦async
调用收集了所有NSData
,主线程就会在后台触发NSOperation
来解析NSData
并将其插入数据库。
因此,NSURLConnection
是异步运行的,而数据库插入是在后台 NSOperation
中运行的。但是,NSURLConnection
和 NSOperation
的编排是在主线程中完成的。鉴于正在下载大量数据,我认为即使主线程上的少量编排也可能会影响我的 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/