0915-多线程 网络开始
---------------------
0915 线程 网络 面试经常问
复习看这里就可以了:
队列中放Thread (执行代码的方法)
一个Thread 只能做一个事情 串行队列(单列 一把只有一个线程 ) 并行队列(多个线程)
串行队列 只开一个新线程 顺序执行多个任务 无异步多线程效果
dispatch_async表示可以开启新线程能力
并行队列 可以开多个线程 不按照顺序来 做多个事情 自动开启多个线程 一般不超过5个线程(包括主线程)
dispatch_async 将事情 放到并行队列中去执行 多线程 [如果放到串行队列那就没有异步效果了,因为是在串行队列中 一般只开一条线程]
dispatch_sync 将事情 放到串行队列中去执行 单线程 [如果放到并发队列里,还是一条线程]
后台表示子线程
由于UI属性都是nonatomic 没有加锁 所以让设置属性和相应事件都在主线程中,防止多线程设置同一个属性(那就乱了)
NSThread方法不能利用多核 所以推荐使用GCD 包括主线程Thread不超过5条
GCD :
1、dispatch_async + dispatch_get_global_queue(并行队列) 最常用 下载图片操作
2、dispatch_async + dispathch_queue_create("abc", DISPATCH_QUEUE_SERIAL);//创建一个串行队列 如果是并行队列DISPATCH_QUEUE_CONCURRENT可以写NULL
非ARC需要手动释放 手动创建的队列 dispatch_release();
3、dispatch_async + dispatch_get_global_queue(); // 主队列-串行队列-里面只有一个主线程 不开新线程
注意点:死循环不执行的代码:不要使用这个 dispatch_sync + dispatch_get_global_queue(); 因为syncMainQueue也是在主队列中(串行队列) 导致下载图片1要等待syncMainQueue执行完毕
// 线程之间通讯 回到主线程,刷新UI界面(为了线程安全)
[self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];//不等主线程downLoad执行完毕 继续往下
//
[self performSelector:@selector(downloadFinished:) onThread:[NSThread
mainThread] withObject:image
waitUntilDone:NO];//等主线程执行完毕downloadFinish才继续往下
// [self.imageView
performSelectorOnMainThread:@selector(setImageWithImage:)
withObject:image waitUntilDone:NO];//等主线程执行完毕 才继续往下
// 获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 默认优先级为0.5 // 将 任务 添加 全局队列 中去 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); });
线程之间通讯
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { dispatch_async(HMGlobalQueue, ^{ NSLog(@"donwload---%@", [NSThread currentThread]); // 1.子线程下载图片 NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; // 2.回到主线程设置图片 dispatch_async(HMMainQueue, ^{ NSLog(@"setting---%@ %@", [NSThread currentThread], image); [self.button setImage:image forState:UIControlStateNormal]; }); }); }
-----------------------------------------------------------------------------------
搜索activity
[self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];//不等主线程downLoad执行完毕 继续往下
// [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];//等主线程执行完毕downloadFinish才继续往下
// [self.imageView performSelectorOnMainThread:@selector(setImageWithImage:) withObject:image waitUntilDone:NO];//等主线程执行完毕 才继续往下