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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,812评论 25 709
  • 一叶两客争,偶遇同路人 携酒浅漫叙,辛味惶觉闻
    长安就很好阅读 149评论 0 0
  • 大脑的空间 如果不能同时 保留各种复杂的性格 面对危机四伏的 人际交往 很快的 会把冰冷的街道 当作睡觉的床榻 地...
    坡山俯望君阅读 129评论 0 0
  • 要实现的 协议----------------- tableview协议 cellForRow----------...
    ArrQing阅读 365评论 0 0
  • 有一种心 文/蛟龙 有一种心 武装全备的保持在 格斗的警戒线上 那是坚强的格式 喜欢避开喧嚣 因为喧嚣 总是在闹市...
    F芳子阅读 187评论 0 0