1

を利用してバックグラウンドに送信するメソッドを呼び出そうとしていますdispatch_async

これは単純なものである必要がありますが、何らかの理由で、メソッドが戻るまで UI がブロックされたままになります。

ここに私が持っているものがあります:

dispatch_queue_t privateQueue = dispatch_queue_create("com", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(privateQueue, ^
{                  
    __block UIImageView *imgView = [[UIImageView alloc] initWithFrame:self.view.frame];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        imgView = [controllerB startProcess];
        controllerC.imageView = imgView;
    });
});

startProcessUIが再び無料になる前に、返品を待つ必要があります.

それから私はimgView = [controllerB startProcess];外に移動しようとしましたdispatch_get_main_queue()

dispatch_async(privateQueue, ^
{                  
    __block UIImageView *imgView = [[UIImageView alloc] initWithFrame:self.view.frame];
    imgView = [controllerB startProcess];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        controllerC.imageView = imgView;
    });
}); 

この場合、UI は更新されimgViewませんが、UI はロックされません。

グローバル キューを使用しようとしましたが、結果は同じです (UI は待機する必要があります)。

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

ここで非常に明白な何かが欠けていると思います。それか、それとも私にとって長い一日でした。

編集:

[controllerB startProcess];

私は以下を利用しています:

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

これらの方法が私の問題を引き起こす GCD と関係があるかどうかはわかりません。画像は単なる .png です。

これについて一生懸命考えました。アイデアが不足しています。画像で UI を更新できる唯一の方法は、メソッド呼び出しを 内dispatch_get_main_queue()に配置することです。これは、画像の準備ができてメソッドが戻るまですべての UI がブロックされるため、GCD を使用する目的に反します。

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

4

2 に答える 2

1

2番目の例で、メインキューにimageViewを設定しようとすると、バックグラウンドでのimageViewの非同期計算がまだ終了していないため、imageViewを表示できない可能性はありますか? その場合、ディスパッチ グループが役立ちます。

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.name.queue”, DISPATCH_QUEUE_CONCURRENT);

dispatch_group_async(group, queue, ^{
    //Do work
    imgView = [controllerB startProcess];
});

dispatch_group_notify(group,queue,^{
    //This code runs as soon as the code in the dispatch group is done.
    controllerC.imageView = imgView;
});
于 2014-02-25T19:37:01.273 に答える
1

2 番目の方法を使用します。完了ブロックを使用するように startProcess を変更し、完了ブロック内で imageView を更新します。これにより、startProcess の完了後に imageView が確実に更新されます。

于 2014-02-25T19:40:32.480 に答える