在我的应用程序中,我正在创建一个带有单个标识符的后台会话(使用单例方法),当用户尝试上传他们的“订单”时,该会话有大约 50-100 个上传任务(图像)。每个订单有大约 25 张图片要上传。
我将 OrderID 存储为 taskDescription,我的委托方法如下所示
-(void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
{
if(!error)
{
[session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks)
{
bool hasMoreTasks = false;
//Loops through tasks, if there is another task with same identifier
//then DON'T change status of order to uploaded
for(NSURLSessionUploadTask *uTask in uploadTasks)
{
if([uTask.taskDescription isEqualToString:task.taskDescription])
{
hasMoreTasks = true;
break;
}
}
if(!hasMoreTasks) {
NSLog(@"all tasks completed for order: %@", task.taskDescription);
//Get Order from Core Data, update Order status to "Sent"
dispatch_async(dispatch_get_main_queue(), ^{
//Stop the spinner on my page and decrement number of orders ready
//for upload
});
}
}
}
}
所有订单都可以上传到我的服务器。它更新 UI 和 CoreData 是问题所在。如果我排队上传 3 个订单,似乎所有 3 个上传,但最后它说一个订单仍未上传。
仅出于调试目的,这是我的 viewWillAppear
-(void)viewWillAppear
{
NSLog(@"viewWillAppear");
[self.backgroundSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
NSLog(@"task count: %@", [NSNumber numberWithInteger:[uploadTasks count]]);
for(NSURLSessionUploadTask *task in uploadTasks)
{
NSLog(@"upload task %ld", task.state);
}
}];
}
起初使用此应用程序时,日志将显示“viewWillAppear”,然后显示“任务计数”和所有上传任务,但在我尝试上传或使用该应用程序后,它更像是我的后台会话所在的线程完全停止工作无论我等多久,唯一会被记录的是“viewWillAppear”。
好像有什么东西阻塞了我的后台线程/队列。有时我也会有处于运行状态的任务不做任何事情..
非常感谢任何帮助/建议。