当我的应用在后台时,我想使用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();
}
}
注意:我已经阅读了相关的SO question,但它没有帮助。
答案 0 :(得分:2)
我发现,在后台,你应该避免让任务队列达到0任务,直到你真的“完成”。相反,如果始终在队列中保留少量任务,则可以获得更好的连续性。例如,当任务数量减少到3时,再增加3个。
Protip:对于一系列活动任务,你最好使用自己的计数器,而不是笨拙的异步-[NSURLSession getTasksWithCompletionHandler:]
。我将后台任务ID(如@(taskID)
)添加/删除到NSSet(例如NSSet *activeTaskIDs
),并使用其中的计数。我拼出来here。
如果您在didComplete...
回调期间执行任何异步,则必须使用UIApplication
的{{1}}和-beginBackgroundTaskWithExpirationHandler:
将其包围。否则,看起来你已经弹出堆栈,iOS会杀了你。