4

私のアプリでは、リモートサーバーと通信を行っていますが、これは遅い可能性があるため、そのコードを非同期で実行することをお勧めします。私はdispatch_asyncに渡すブロックに通信コードを持っています。このコードは通信を行い、通信が完了するとラベルのテキストを設定します。この最後の部分が問題です。テキストは設定されていますが、数秒遅れて発生します。これは私のコードです。

- (void)doNetworkingTask {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Slow network task goes here.

        // Slow network task done, notify the user.
        [self.myLabel setText:@"task done."];
        NSLog(@"task done.");
    });
}

ここで何が起こるかというと、私のネットワークタスクが完了し、NSLog-textがログに記録され、数秒後にラベルのテキストが更新されます。私の質問は1)ラベルテキストがすぐに更新されないのはなぜですか?そして2)私がやりたいことをする適切な方法は何ですか?(他に何もブロックせずに低速ネットワークタスクを実行し、完了したらテキストラベルを使用してユーザーを更新します。)

4

1 に答える 1

7

UIの更新はメインスレッド上にある必要があります。コードを次のように更新します。

- (void)doNetworkingTask {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Slow network task goes here.

        // Slow network task done, notify the user.
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.myLabel setText:@"task done."];
        });
        NSLog(@"task done.");
    });
}
于 2013-02-07T16:38:36.787 に答える