用过<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在这里调用回调函数时应该是采用了异步分发的策略。
既然这里会出现多线程,在后续的程序逻辑中就需要充分考虑多线程可能造成的问题。加油😂
网友评论