2

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

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

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

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

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

随着目前的机制,我注意到一些偶尔在UI中犹豫。通过将整个机制置于后台NSOperation我希望UI将保持响应。

任何智慧的话将非常感激。

谢谢。

回答

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+)。

+0

您可以指定处理NSURLConnection委托方法的队列,此代码不是必需的。 – jrturton 2013-03-27 12:03:20