美文网首页
iOS小记--initWithDelegate:queue:op

iOS小记--initWithDelegate:queue:op

作者: 原鸣清 | 来源:发表于2020-03-24 10:47 被阅读0次

    用过<CoreBluetooth>的同学都知道,标题里的那个方法是用来创建CBCentralManager实例的,这是iOS提供的一个BLE中心角色的抽象,通常使用方法如下:

    *  @param delegate The delegate that will receive central role events.
    *  @param queue    The dispatch queue on which the events will be dispatched.
    *  @param options  An optional dictionary specifying options for the manager.
    self.centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:[self bleQueue] options:options];
    

    Api文档中的参数说明我一并抄在上边了,delegate没啥好说的,就是委托人实例,常见传入self,options是一个字典,用来设置中心的一些属性,比如说搜索时允许回调重复的周边设备等等,设置蓝牙后台模式的RestoreIdentifier,你可以在API里查看。

    这里主要想讲一下queue的问题,很多同学容易把queue和线程搞混,认为是自建队列就一定是相通的线程了。还是重新解释下:

    队列是面向人的概念,队列的特点是先入先出,queue就是用来约定程序(或者叫事务,函数都行)的先后顺序,这个是程序员视角。线程是面向计算机的概念,为了充分利用计算机性能,让计算机能够同时做多件事(事实上CPU有几个核就可以做几件事,表示上可以做到更多是因为多道程序设计

    想更好地理解线程和队列的问题推荐看这篇

    回到我们的问题,当我在创建centralManager时指定了一个通过dispatch_queue_create自建的queue,CentralManager的回调函数会不会在同一个线程返回呢?做个测试先,通过[NSThread currentThread]函数把线程信息打印出来。

    截屏2020-03-2409.50.16.png

    如上图,线程的id并不相同,说明回调函数不是在同一线程返回。找找资料,在上面提到的哪篇博客里有说:

    截屏2020-03-2410.09.55.png

    手动创建的串行队列在异步分发的情况下会开启新线程,所以推测,CBCentralManager在这里调用回调函数时应该是采用了异步分发的策略。

    既然这里会出现多线程,在后续的程序逻辑中就需要充分考虑多线程可能造成的问题。加油😂

    相关文章

      网友评论

          本文标题:iOS小记--initWithDelegate:queue:op

          本文链接:https://www.haomeiwen.com/subject/cuonyhtx.html