13.线程间通信
2017-09-07 本文已影响367人
豆丶浆油条
整个《面试题》都是对[2017年6月iOS招人心得(附面试题)]的整理
1.线程间通信简介
所谓线程间的通信,就是一个线程操作完数据之后,另一个线程再去操作这组数据。最常见的例子就是,子线程下载数据,主线程更新UI。其实线程间的通信是非常普遍的, 只要你的App进行了数据请求就一定会发生。至于很多iOS程序员没有发现,是因为几乎所有网络请求的框架的回调都是在主线程进行的,框架设计者都设计好了,所以你什么都不需要干。
2.常见的通信方式
1.GCD
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//子线程请求数据
dispatch_async(dispatch_get_main_queue(), ^{
//主线程更新UI
});
});
2.NSObject
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);
3.NSOperation
[NSOperationQueue mainQueue] addOperationWithBlock:^{
//更新UI
}
3.多线程同时操作一个数据
春运的时候,就剩下一张票了,100个人同时购买,怎么办,难道每个人都能购买成功?肯定不是,只要一个人买了,其他人就不能买了,不然票的数量得出现负数。这就出现了强占资源,多条线程同时操作一个数据。iOS多线程之2.NSThread的加锁@synchronized。这篇文章给出了一种解决方式,其实还有很多,NSLock、信号量、NSConditionLock、barrier。其实实现得方向都是一致的,就是只要有一条线程操作这个数据,其他线程就不能操作了,等这个线程操作完了才能继续操作。