当我的应用程序在后台运行时,我想使用 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 个任务,直到您真正“完成”为止。相反,如果您始终在队列中保留少量任务,则可以获得更好的连续性。例如,当任务数量减少到 3 个时,再添加 3 个。
专业提示:对于事件任务的计数,您最好使用自己的计数,而不是笨拙的异步 -[NSURLSession getTasksWithCompletionHandler:]
。我将后台任务 ID(如 @(taskID)
)添加/删除到 NSSet(例如 NSSet *activeTaskIDs
),并使用其中的计数。我把这个写出来here .
括号异步调用
如果您在 didComplete...
回调期间执行任何事情异步,则必须用 UIApplication
的 - 包围它beginBackgroundTaskWithExpirationHandler:
和-endBackgroundTask:
。否则,看起来你已经弹出了堆栈,iOS 会杀死你。
关于ios - NSURLSessionUploadTask 后台持续上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976938/