NSURLSessionUploadTask在后台连续上传

时间:2013-11-14 11:52:12

标签: 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,但它没有帮助。

1 个答案:

答案 0 :(得分:2)

保持任务队列最终

我发现,在后台,你应该避免让任务队列达到0任务,直到你真的“完成”。相反,如果始终在队列中保留少量任务,则可以获得更好的连续性。例如,当任务数量减少到3时,再增加3个。

Protip:对于一系列活动任务,你最好使用自己的计数器,而不是笨拙的异步-[NSURLSession getTasksWithCompletionHandler:]。我将后台任务ID(如@(taskID))添加/删除到NSSet(例如NSSet *activeTaskIDs),并使用其中的计数。我拼出来here

支架异步调用

如果您在didComplete...回调期间执行任何异步,则必须使用UIApplication的{​​{1}}和-beginBackgroundTaskWithExpirationHandler:将其包围。否则,看起来你已经弹出堆栈,iOS会杀了你。