在子线程的任务完成后,有时候需要从子线程回到主线程,刷新UI。 从子线程中回到主线程,以前已经写过一种方法:
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
现在GCD又提供了一种方法:
dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image=image; });
示例代码:
// // ViewController.m // GCDTest // // Created by 登 on 2017/6/16. // Copyright ? 2017年 登. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"主线程----%@",[NSThread mainThread]); } -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event { //1 获取一个全局队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2 把任务添加到队列中执行 dispatch_async(queue, ^{ //打印当前的线程 NSLog(@"%@",[NSThread currentThread]); //3.从网络下载图片 NSURL *urlStr = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"]; NSData *data = [NSData dataWithContentsOfURL:urlStr]; UIImage *image = [UIImage imageWithData:data]; //提示 NSLog(@"图片加载完毕"); //4.回到主线程,展示图片 // [self.imageView performSelectorOnMainThread:@selector(setImageView:) withObject:image waitUntilDone:NO]; dispatch_async(dispatch_get_main_queue(), ^{ _imageView.image = image; NSLog(@"%@",[NSThread currentThread]); }); }); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end
打印结果:
2017-06-16 17:55:45.848 GCDTest[15011:2269875] 主线程----<NSThread: 0x60800007f600>{number = 1, name = main}
2017-06-16 17:56:43.391 GCDTest[15011:2269966] <NSThread: 0x60000026b980>{number = 3, name = (null)}
2017-06-16 17:56:43.463 GCDTest[15011:2269966] 图片加载完毕
2017-06-16 17:56:43.463 GCDTest[15011:2269875] <NSThread: 0x60800007f600>{number = 1, name = main}
本文参考:http://www.cnblogs.com/wendingding/p/3807265.html
时间: 2024-10-12 08:34:40