0

プログラムの一部があります:

dispatch_sync (dispatch_get_main_queue (), ^ {
    [startBtn setTitle: @ "Loading ..." forState: UIControlStateNormal];
    [self loadImages]; / / loading images - AssesLibrary
});

[self makeCollage];
NSLog (@ "Albums found:% lu", (unsigned long) [assetGroups count]);

ブロックからdispatch_syncプログラムが出てきて、最初に[self loadImages](データの配列を埋めた)の機能を実行し、後で実行する必要があり[self makeCollage]ます。いいえdispatch_sync-[self makeCollage]配列をさらに処理せずに入力を開始し、エラーが発生します。

なり方をアドバイス

4

3 に答える 3

4

追加した :

dispatch_queue_t currentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(currentQueue, ^{ 

    __block UIImage *image=nil; 
    dispatch_sync(currentQueue, ^{ 

        //download the image here 
        image = [self loadImages];

    }); 

dispatch_sync(dispatch_get_main_queue(), ^{ 

        //handle the image to the user here on the main queue 
        if (image != nil){ 
            [self makeCollage];
        } else 
        { 
            NSLog(@"Image isn't downloaded. Nothing to do."); 
        } 

    }); 
}); 
于 2013-10-30T09:33:22.443 に答える
0

Gabriele が述べたように、デッドロックを引き起こしています。次の 2 つのオプションがあります。

  1. 新しい同期キューを作成しますが、ブロックで UIKit を使用しているようです。ほとんどのUIKitは、特にディスプレイに影響を与える部分ではスレッドセーフではありません
  2. dispatch_sync を使用する代わりに、メイン キューで dispatch_async を使用します。

バックグラウンド スレッドで作業を送信する場合は、ロジックを別の方法で編成する必要があります。

于 2013-10-30T08:14:17.630 に答える