【问题标题】:NSOperation versus Asynchronous NSURLConnectionNSOperation 与异步 NSURLConnection
【发布时间】:2013-03-27 11:12:38
【问题描述】:

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

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

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

所以,我正在考虑将代码重构为单个背景NSOperation,并将NSURLConnection 变为同步调用。然后单个NSOperation 将同步下载NSData 并管理数据库插入。

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

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

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

谢谢。

【问题讨论】:

    标签: objective-c cocoa-touch nsurlconnection nsoperation nsoperationqueue


    【解决方案1】:

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

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

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

    【讨论】:

    • 你可以指定处理NSURLConnection委托方法的队列,这段代码不是必须的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2012-09-19
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多