问题描述
我正在尝试实现一个iOS应用,该应用可以通过蓝牙设备扫描附近。目前,我已经实现了扫描所有广告设备并将它们作为列表显示在显示器上的方法。
但是,我注意到,只要RSSI
值发生更改,它甚至会列出以前扫描的设备(重复项)。因此,我编写了一个逻辑,即如果列表先前已插入到数组中,则不更新列表。
但是,我确实想更新这些设备的RSSI
值。我不太确定如何访问Swift中的现有项目。项目被定义为数组的结构。我已经编写了如下代码片段,以更新特定的匹配项RSSI
。但是,它不起作用。
for existing in peripherals {
print("*******")
print(existing.name)
print(peripheralName as String)
print("$$$$$$")
if let index = peripherals.indices.first(where: { _ in existing.name == peripheralName }) {
peripherals[index].RSSi = RSSI.intValue
addItem = false
print("update RSSi")
}
}
请在下面查看完整代码。
import Foundation
import CoreBluetooth
struct Peripheral: Identifiable {
let id: Int
var name: String
var RSSi: Int
}
class BLEManager: NSObject,ObservableObject,CBCentralManagerDelegate {
var myCentral: CBCentralManager!
@Published var isSwitchedOn = false
@Published var peripherals = [Peripheral]()
@Published var addItem = false
override init() {
super.init()
myCentral = CBCentralManager(delegate: self,queue: nil)
myCentral.delegate = self
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
isSwitchedOn = true
} else {
isSwitchedOn = false
}
}
func centralManager(
_ central: CBCentralManager,diddiscover peripheral: CBPeripheral,advertisementData: [String: Any],RSSi RSSI: NSNumber
) {
var peripheralName: String!
//let RSSi_updated = RSSI.intValue
if let name = peripheral.name {
peripheralName = name
} else {
peripheralName = "UnkNown"
}
if peripherals.isEmpty {
print("List Empty")
addItem = true
} else {
print("List not Empty")
addItem = true
for existing in peripherals {
print("*******")
print(existing.name)
print(peripheralName as String)
print("$$$$$$")
if let index = peripherals.indices.first(where: { _ in existing.name == peripheralName }) {
peripherals[index].RSSi = RSSI.intValue
addItem = false
print("update RSSi")
}
}
}
if addItem {
let newPeripheral = Peripheral(id: peripherals.count,name: peripheralName,RSSi: RSSI.intValue)
peripherals.append(newPeripheral)
print("------")
print(newPeripheral)
}
}
func startScanning() {
print("startScanning")
myCentral?.scanForperipherals(withServices: nil,options: [CBCentralManagerScanoptionAllowDuplicatesKey: false])
}
func stopScanning() {
print("stopScanning")
myCentral.stopScan()
}
}
任何想法我该如何实现?
非常感谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)