1

私のアプリでは、ユーザーが「注文」をアップロードしようとすると、最大 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」だけです。

何かがバックグラウンド スレッド/キューをブロックしているようです。何もしていない実行中のタスクがあることもあります..

どんな助け/提案も大歓迎です。

4

0 に答える 0