ios - NSURLSessionUploadTask 后台持续上传

标签 ios objective-c ios7 nsurlconnection nsurlsession

当我的应用程序在后台运行时,我想使用 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/

相关文章:

ios - iPhone webview 上的引导网格系统对齐问题

ios - 当应用程序进入前台时重新加载 CloudKit 数据

objective-c - 如何有条件地将框架包含在 Xcode 项目中?

ios - 在 iOS 7 中设置导航栏图像

ios - UITableViewCell 不显示数据 - Swift Playgrounds

ios - NSNotificationCenter 可以在不同的应用程序之间进行通信吗?

iphone - 深入了解崩溃

ios - 如果 UIGestureRecognizer 触发,如何取消按钮点击?

iphone - 切换到 iOS 7 后 UITableView 不滚动

iOS 7 Dev - @synthesize 不自动创建 ivars