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