dispatch_async不像宣传的那样工作

时间:2014-06-12 19:22:51

标签: objective-c ios7 dispatch-async

我对iOS仍然非常环保,但下面的代码似乎应该可行。我在后台做了很多工作,所以忙碌的指标"应该在工作完成时向用户显示。但是发生的事情是忙碌指示器几秒钟内没有出现。只有大部分工作(但不是全部)完成后才会出现。

- (void) fetchDataTest {

    // next line will create and display a busy indicator
    __block MRProgressOverlayView *overlay = [MRProgressOverlayView showOverlayAddedTo:self.view title:@"Loading…" mode:MRProgressOverlayViewModeIndeterminate animated:YES];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(void) {

        [self fetchData];

        dispatch_async(dispatch_get_main_queue(), ^(void) {
            [overlay hide:YES];
        });
    });
}

我有很多日志记录(上面没有显示)运行得太慢我可以看输出日志(包括线程ID)并看到叠加已经创建并开始后台工作 - 但我的设备上没有覆盖几秒钟。

如何立即显示叠加效果?

1 个答案:

答案 0 :(得分:0)

观察:

  1. 您不应该使用GCD使同步数据提取看起来是异步的 - 只需直接使用异步提取。它们在整体调度和电池寿命方面要好得多;
  2. 这是dispatch_async之前没有发生的事情,而不是其中的内容;
  3. Jack Wu的猜测可能是正确的:在fetchDataTest执行什么线程或队列?它应该是主要队列。
  4. 关于最后一点:UIKit通常不是线程安全的。除了少数例外,您应该始终从主队列中使用它。这是当前主队列的主要部分:所有用户交互。然后繁重的工作应该在别处传递。