私のアプリでは、ユーザーが「注文」をアップロードしようとすると、最大 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 つすべてがアップロードされたように見えますが、最終的に 1 つの注文がまだアップロードされていないと表示されます。
デバッグ目的のためだけに、ここに私の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」、「Task Count」、およびすべてのアップロード タスクが表示されますが、アプリをアップロードまたは使用しようとすると、バックグラウンド セッションがオンになっているスレッドのようになり、完全に機能しなくなりますログに記録されるのは、どれだけ待っても「viewWillAppear」だけです。
何かがバックグラウンド スレッド/キューをブロックしているようです。何もしていない実行中のタスクがあることもあります..
どんな助け/提案も大歓迎です。