2

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

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

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

因此,我正在考虑将代码重构为单个背景NSOperation并进行NSURLConnection同步调用。然后一个单一的NSOperation将同步下载NSData和管理数据库插入。

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

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

任何智慧之言将不胜感激。

谢谢。

4

1 回答 1

2

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

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

编辑:正如@jrturton 在评论中所说,您可以指定NSURLConnection委托方法的队列。使用setDelegateQueue:方法(iOS 5.0+)。

于 2013-03-27T11:54:26.067 回答