13.线程间通信

整个《面试题》都是对[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。其实实现得方向都是一致的,就是只要有一条线程操作这个数据,其他线程就不能操作了,等这个线程操作完了才能继续操作。

你可能感兴趣的:(13.线程间通信)