当我的应用程序在后台的时候,我想用NSURLSessionUploadTask上传很多文件。
通过适当配置的NSURLSession对象,用于排队的后台上载的API是:
NSURLSessionUploadTask *dataTask = [sessionObj uploadTaskWithRequest:urlRequest
fromFile:localFilePath];
[dataTask resume];当上传完成--成功还是失败--我会在后台得到这个回调:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error在上面的回调过程中,我用
-uploadTaskWithRequest:fromFile:。
但是在上传了一些文件之后,回调就停止了,上传也停止了。
有什么东西我错过了继续上传吗?我是否需要在这个回调中添加一些额外的代码来保持上传的正常进行?
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session {
AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
if (appDelegate.backgroundSessionCompletionHandler) {
void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler;
appDelegate.backgroundSessionCompletionHandler = nil;
completionHandler();
}
}注意到:我已经读过这个相关的question了,但是没有帮助。
发布于 2014-02-10 18:27:24
关闭任务队列
我发现,在后台,您应该避免让任务队列到达0任务,直到真正“完成”为止。相反,如果始终保持队列中的任务很少,则可以获得更好的连续性。例如,当任务数减少到3个时,再添加3个任务。
Protip:对于活动任务的计数,最好是使用自己的计数,而不是笨拙的异步-[NSURLSession getTasksWithCompletionHandler:]。我将后台任务ID (作为@(taskID))添加/移除到NSSet (例如,NSSet *activeTaskIDs)中,然后使用计数。我把这个拼出来了,here。
括号异步调用
如果您在didComplete...回调期间执行任何异步操作,则必须用UIApplication的-beginBackgroundTaskWithExpirationHandler:和-endBackgroundTask:包围它,否则,看起来您已经弹出了堆栈,iOS会杀死您。
https://stackoverflow.com/questions/19976938
复制相似问题