如何等到委托方法被调用?

时间:2016-01-14 20:21:01

标签: ios swift asynchronous delegates cbcentralmanager

我想创建一个方法startCentralManager,它等待调用委托方法centralManagerDidUpdateState并根据中心状态返回一个布尔值。

我想使用这样的方法:

let centralManager = CentralManager()
let ready = centralManager.startCentralManager()

CentralManager类看起来应该是这样的

class CentralManager: NSObject, CBCentralManagerDelegate {
   var centralManager: CBCentralManager?

   func startCentralManager() -> Bool {
      centralManager = CBCentralManager.init(delegate: self, queue: nil)
   }

   func centralManagerDidUpdateState(central: CBCentralManager) {
      // startCentralManager() should return this
      return central.state == CBCentralManagerState.PoweredOn
   }
}

我该如何解决这个问题?

非常感谢,提前。

更新

还有其他一些方法,但情况几乎相同。另一种方法如下:

let connected = centralManager.connect<PARAMS>)

在此方法中,如果必须调用

func scanForPeripheralsWithServices(_ serviceUUIDs: [CBUUID]?, options options: [String : AnyObject]?)

并等到委托方法

func centralManager(_ central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData advertisementData: [String : AnyObject], RSSI RSSI: NSNumber)

被调用。在这里,我必须致电

func connectPeripheral(_ peripheral: CBPeripheral, options options: [String : AnyObject]?)

再次等到委托方法

func centralManager(_ central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral)

被调用。如果成功,对centralManager.connect(<PARAMS>)的调用应返回true

3 个答案:

答案 0 :(得分:0)

CBCentralManager异步工作,您可以通过在某个时间段对您的代表打电话通知您无法直接控制其状态。

您不能等待两行代码之间的异步响应。您必须以不同的方式设计您的程序。

如果您的视图控制器取决于CBCentralManager的准备情况,您可以将其作为委托并在调用centralManagerDidUpdateState函数时启用其外围设备相关控件。

例如

(如果您将其用于扫描仪):

class ScanningViewController:UIViewController,CBCentralManagerDelegate
{
   var centralManager: CBCentralManager? = nil
   override viewDidLoad()
   {
      centralManager = CBCentralManager.init(delegate: self, queue: nil)
   }

   func centralManagerDidUpdateState(central: CBCentralManager) 
   {
     if central.state == CBCentralManagerState.PoweredOn
     {
       // enable scanning controls here
     }
   }
} 

答案 1 :(得分:0)

我找到了解决方案:

class CentralManager: NSObject, CBCentralManagerDelegate {
   var centralManager: CBCentralManager?
   var ready: Bool = false

   func startCentralManager() -> Bool {
      centralManager = CBCentralManager.init(delegate: self, queue: nil)

      ready = false
      while ready == false {
         NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture())
      }

      return ready
   }

   func centralManagerDidUpdateState(central: CBCentralManager) {
      ready = central.state == CBCentralManagerState.PoweredOn
   }
}

这是一个很好的编程习惯吗?有更好的解决方案吗?

谢谢。

答案 2 :(得分:0)

创建一个每X秒触发一次的计时器

在计时器的选择器内检查是否连接并使计时器无效或让它继续检查是否未连接

或者考虑使用信号量和dispatch_wait_forever