我必须等待 Swift 中的 didReadRSSI() 函数吗?

Posted

技术标签:

【中文标题】我必须等待 Swift 中的 didReadRSSI() 函数吗?【英文标题】:Do I have to wait for the didReadRSSI() function in Swift? 【发布时间】:2015-09-26 01:17:36 【问题描述】:

我想发现我所在地区的 BLE 设备并存储它们当前的 RSSI 值。发现有效,但我确定,如果我的函数 didDiscoverPeripheral 真的保存...我认为我应该在离开 didDiscoverPeripheral 之前等待 didReadRSSI 函数。但是我怎样才能以一种简单的方式意识到这一点,我的观点是否正确?

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

    CBperipheral = [peripheral]

    peripheral.readRSSI()


func peripheral(peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: NSError?)

    //Store the peripheral specific RSSI, Name and identifier

【问题讨论】:

您不能在didDiscoverPeripheral 中“等待”。当它发生时,您需要处理对didReadRSSI 的回调。您的didDiscoverPeripheral 的第一行也没有任何意义。我建议您创建一个由外围设备键入的 RSSI 值字典。 请看我的回答:) 【参考方案1】:

我会建议这样的东西-

var peripherals = Set<CBPeripheral>
var peripheralRSSIs = Dictionary<CBPeripheral,NSNumber>()


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

    self.peripherals.insert(peripheral)
    self.peripheralRSSIs[peripheral]=RSSI
    central.connectPeripheral(peripheral,options:nil) // Connect if you want to be able to retrieve additional RSSI values


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

    peripheral.delegate=self
    peripheral.readRSSI()


func peripheral(peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: NSError?)

    if (error != nil) 
        print(error)
     else 
        self.peripheralRSSIs[peripheral]=RSSI
    

【讨论】:

【参考方案2】:

我解决了这样的问题:

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

    CBperipheral = [peripheral]
    myStrings.append(StringPair("\(peripheral.name!)", "\(peripheral.name!)", "\(RSSI)"))
    //Coose the right peripheral and connect!

我不需要RSSI 的最新值,只需要一些指导值。所以我希望这段代码符合ios 8及更高版本。

但如果你能告诉我处理我的didReadRSSI 的回调来解决类似这样的其他问题,那就太好了。

顺便说一句。我必须写这个:CBperipheral = [peripheral] 在调用CBmanager.connectPeripheral 之后调用我的didConnectPeripheral :)

【讨论】:

以上是关于我必须等待 Swift 中的 didReadRSSI() 函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 C# 异步等待

如何在执行函数之前等待 Swift 中的变量? (迅速)

Swift 3 中的顺序网络请求

如何在从 Swift 3 中的函数返回结果之前等待 URLSession 完成

如何让类中的初始化方法等待 Firestore 在 Swift 4 中完成?

等待 Parse Async 函数在 Swift 中完成