问题是:

今天研究到了一个有趣的问题,在这里先Mark一下。现在还是搞不懂!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (IBAction)touchButton:(id)sender
{
NSLog(@"--------");
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{

NSURL *url = [NSURL URLWithString:@"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_redBlue.png"];

NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];

NSLog(@"%@", image);
NSLog(@"%@", [NSThread currentThread]);

// 此时主线程没有被占用
dispatch_sync(queue, ^{
NSLog(@"----------_A");
self.imageView.image = image;
NSLog(@"----------_B");
});
NSLog(@"设置图片完毕 %@", image);
});
}

在显示完以下所有输出信息(说明此时已经下载完图片)后,图片需要几秒才会显示。

控制台输出

解决思路:A和B之间的self.imageView.image = image;可能做了两件事:

  • 逻辑设置(确定是占用了子线程)
  • 渲染界面(UI更新只能通过主线程?)

主要问题在于子线程如何告知主线程更新UI,里面的细节暂时不知道。

有趣的是:

  1. 按了Button立刻按Home键再进入App,图片立刻显示!
  2. 使用-performSelectorOnMainThread: withObject waitUntilDone:可以使得图片立刻显示。因为调用了主线程执行?

MARK!