我正在使用异步NSURLConnection
上传我的图片。我有一个小要求,我想知道实现它的有效方法是什么。当我按下上传按钮时,我会弹出我当前的视图控制器,所以我需要的是我的上传操作继续在后台进行,即使我在我的导航控制器堆栈的任何部分。我可以导航并在任何地方,但仍希望在后台进行上传。
我只需要关于什么是实现这一目标的有效和优雅方式的提示。
我正在使用异步NSURLConnection
上传我的图片。我有一个小要求,我想知道实现它的有效方法是什么。当我按下上传按钮时,我会弹出我当前的视图控制器,所以我需要的是我的上传操作继续在后台进行,即使我在我的导航控制器堆栈的任何部分。我可以导航并在任何地方,但仍希望在后台进行上传。
我只需要关于什么是实现这一目标的有效和优雅方式的提示。
在这种情况下,您所说的“在后台”是指 - 在另一个线程上。因此,您正在谈论多线程。不要与 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...
});
});
您需要将上传逻辑与触发它的视图控制器分开。
也许你可以创建一个“上传管理器”类来处理来自队列中不同视图控制器的所有上传,并通知感兴趣的视图控制器有关进度、错误等的信息(例如通过通知)。
然后,它还可以管理后台任务标识符,以便在您的应用程序通过按下主页按钮发送到后台时继续上传。