2

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

我只需要关于什么是实现这一目标的有效和优雅方式的提示。

4

2 回答 2

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...
    });

});
于 2012-08-06T03:32:42.620 回答
1

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

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

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

于 2012-08-06T03:41:55.010 回答