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 回答