0

我对 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)并看到覆盖已创建并且后台工作开始 - 但我的设备上没有出现覆盖几秒钟。

如何让叠加层立即出现?

4

1 回答 1

0

观察:

  1. 你不应该使用 GCD 让同步数据获取看起来是异步的——直接使用异步获取。它们对于整体调度和电池寿命要好得多;
  2. 没有发生的是在 s 之前发生的位,dispatch_async而不是其中的内容;
  3. Jack Wu 的猜测可能是对的:在哪个线程或队列fetchDataTest上执行?它应该是主队列。

最后一点:UIKit 通常不是线程安全的。除了少数例外,您应该始终从主队列中使用它。这是当今主队列的很大一部分:所有用户交互。那么繁重的工作应该转移到其他地方。

于 2014-06-12T19:33:34.977 回答