【问题标题】:Specify dispatch queue on iOS在 iOS 上指定调度队列
【发布时间】:2014-10-31 00:44:05
【问题描述】:

使用 Swift,我有一个自定义类,它包装了 CBCentralManager 类,如下所示:

import UIKit
import CoreBluetooth

protocol vaBeanDelegate
{

}

class vaBean: CBCentralManager, CBCentralManagerDelegate {

override init() {
    println("bean manager initialised")
    super.init()
    self.delegate = self
}

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
    println("discovered peripheral(s)")
}

func centralManagerDidUpdateState(central: CBCentralManager!) {
    switch (central.state) {
    case .PoweredOff:
        println("hardware is powered off")

    case .PoweredOn:
        println("hardware is powered on and ready")
        //centralManager.scanForPeripheralsWithServices(nil, options: nil)
    case .Resetting:
        println("hardware is resetting")

    case .Unauthorized:
        println("state is unauthorized")

    case .Unknown:
        println("state is unknown");

    case .Unsupported:
        println("hardware is unsupported on this platform");

    }
}

func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
    println("didConnectPeripheral")
}

func searchForNewBeans() {
    println("searching for new beans...")
    self.scanForPeripheralsWithServices(nil, options: nil)
}
}

类初始化,然后我可以调用searchForNewBeans 函数,但我没有收到来自didUpdateStatedidDiscoverPeripheral 函数的任何响应。我怀疑这是因为我的新班级不知道它应该是这些的接收者,但是我将如何以及在哪里指定呢?我ViewController中的调用代码如下:

import UIKit

class ViewController: UIViewController {

var myBean: vaBean!

override func viewDidLoad() {
    super.viewDidLoad()
    println("blueToothTest v1.00")
    println("opening bluetooth connection ...")
    myBean = vaBean()
    myBean.searchForNewBeans()
}

override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()}
}

我当前执行时的日志如下:

blueToothTest v1.00

打开蓝牙连接...

bean 管理器已初始化

正在寻找新的豆子...

【问题讨论】:

    标签: ios inheritance swift


    【解决方案1】:

    我认为您的第一个问题是您没有为 CBCentralManager 调用指定的初始化程序。

    另外,在您处于PoweredOn 状态之前,您不能调用scanForPeripheralsWithServices

    您当前代码的编写方式无疑会在此状态之前调用scanForPeripheralsWithServices

    我建议如下:

    import UIKit
    import CoreBluetooth
    
    protocol vaBeanDelegate
    {
    
    }
    
    class vaBean: CBCentralManager, CBCentralManagerDelegate {
    
    var isScanning=false
    var isPowered=false
    
     override init() {
    
        println("bean manager initialised")
        super.init(delegate: nil, queue: nil, options:[NSObject : AnyObject]())   //Initialise with self as the delegate and default queue
        self.delegate=self
    
    }
    
    func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
        println("discovered peripheral(s)")
    }
    
    func centralManagerDidUpdateState(central: CBCentralManager!) {
        switch (central.state) {
        case .PoweredOff:
            println("hardware is powered off")
    
        case .PoweredOn:
            println("hardware is powered on and ready")
            self.isPowered=true
            if (self.isScanning) {
               self.searchForNewBeans()
            }
            //centralManager.scanForPeripheralsWithServices(nil, options: nil)
        case .Resetting:
            println("hardware is resetting")
    
        case .Unauthorized:
            println("state is unauthorized")
    
        case .Unknown:
            println("state is unknown");
    
        case .Unsupported:
            println("hardware is unsupported on this platform");
    
        }
    }
    
    func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
        println("didConnectPeripheral")
    }
    
    func searchForNewBeans() {
        self.isScanning=true;
        if (self.isPowered) {
            println("searching for new beans...")
            self.scanForPeripheralsWithServices(nil, options: nil)
        }
    }
    }
    

    【讨论】:

    • +1。此外,要回答 OP 关于调度队列的问题 - 代码将其保留为 nil,根据文档,它“使用主队列调度中心角色事件”。
    • 谢谢。即使我实现了指定的初始化程序,我的问题是没有调用任何函数。上面的代码更改是有意义的,但是一旦类被初始化,就不会调用 centralManagerDidUpdateState。
    • 在 'init()' 中,'self.init(delegate:self,queue:nil)' 行给出了“在调用 self.init 之前在委托初始化程序中使用'self'”的错误.我现在更困惑了。
    • 我不确定 - 让我在 XCode 中尝试一下并更新我的答案
    • 我已经更新了我的答案以调用正确的超类初始化程序并且我的测试发现了外围设备
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-10-11
    • 2017-10-26
    • 2017-07-20
    相关资源
    最近更新 更多