在背景上的异步任务

时间:2012-08-06 03:19:04

标签: iphone nsurlconnection

我使用异步NSURLConnection上传我的图片。我有一个小要求,我想知道实现它的有效方法是什么。当我按下上传按钮然后我弹出我当前的视图控制器,所以我需要的是我的上传操作继续在背景上,即使我在我的导航控制器堆栈的任何部分。我可以导航并在任何地方,但仍然希望上传发生在后台。

我只需要提供有关实现这一目标的有效和优雅方法的提示。

2 个答案:

答案 0 :(得分:3)

在这种情况下,你在“背景”上的意思是 - 在另一个线程上。因此,您在谈论多线程。不要与iOS中的后台处理混淆 - 在应用程序处于后台时执行的任务。

为了做你想做的事情,我建议使用GCD(Grand Central Dispatch),你可以dispatch block代码到另一个线程(除了主要的线程)为了实现流畅的“背景式”处理 - 请记住主线程处理所有与UI相关的内容,为了不阻止它(字面意思),有必要执行任何持久的过程,如下载/上传来自另一个线程的远程源。

这是你可以这样做的一个例子:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Prepare your upload request

    NSError * _urlError = nil;
    NSHTTPURLResponse * _responseHeaders = nil;
    NSData * responseData = [NSURLConnection sendSynchronousRequest:uploadHTTPRequest 
                                                  returningResponse:&_responseHeaders 
                                                              error:&_urlError];

    // by this line, we have a response
    dispatch_async( dispatch_get_main_queue(), ^{
        // Update UI or whatever, this is where you "rejoin" the main thread if needed.
        // Maybe for development, show a UIAlertView...
    });

});

答案 1 :(得分:1)

您需要将上传逻辑与触发它的视图控制器分开。

也许你可以创建一个"上传管理器"处理队列中不同视图控制器的所有上传的类,只是通知感兴趣的视图控制器有关进度,错误等的信息(例如通过通知)。

然后,当按下主页按钮将应用程序发送到后台时,它还可以管理后续任务标识符以继续上传。