Необходимо обновлять данные UITableViewCell в режиме реального времени.IOS

Программируем под IOS
Ответить
Anonymous
 Необходимо обновлять данные UITableViewCell в режиме реального времени.

Сообщение Anonymous »


Я работаю над приложением Bluetooth, получающим данные устройства от широковещательных устройств, все данные поступают без каких-либо проблем. Этот код мы используем для тестирования наших устройств, и эта база кода фильтрует только эти устройства.

let deviceLocations: [String: String] = [ "00000534": "Офис", "00000523": "Прием", "00000525": "Обеденная комната" ]

Я добавил для этой цели Все работает без каких-либо проблем

У меня есть таблица, показывающая имя устройства, UUID, RSSI и местоположение

Мой вопрос: я получаю значения в реальном времени от устройств, но эти значения не обновляются в ячейке табличного представления.

необходимо обновлять данные табличного представления в режиме реального времени

нужно отметить, что я добавил обновление на 5 секунд, но все равно не работает

Я прикрепил свой код ниже. кто-нибудь, пожалуйста, помогите мне решить эту проблему
импортировать UIKit импортировать CoreBluetooth импорт Комбинат класс DeviceListViewController: UIViewController, BluetoothManagerDelegate, UITableViewDelegate, UITableViewDataSource, CBCentralManagerDelegate { @IBOutlet слабая переменная tableView: UITableView! @IBOutlet слабый вар сильнейшийRSSILabel: UILabel! вар bluetoothManager: BluetoothManager! вар CentralManager: CBCentralManager! var обнаруженные устройства: [CBPeripheral] = [] var rssiValues: [CBPeripheral: NSNumber] = [:] вар rssiValue: Int = 0 var rssiUpdateTimer: Таймер? var deviceInfoArray: [DeviceInfo] = [] @Published var сильнейшийRSSI: NSNumber? вар сильнейшийПериферийный: CBPeripheral? пусть устройствоLocations: [String: String] = [ "00000534": "Офис", "00000523": "Прием", "00000525": "Обеденная комната" ] частное наблюдение var: AnyCancellable? переопределить функцию viewDidLoad() { супер.viewDidLoad() tableView.delegate = сам tableView.dataSource = сам CentralManager = CBCentralManager (делегат: сам, очередь: ноль) BluetoothManager = BluetoothManager() bluetoothManager.delegate = сам bluetoothManager.startScanning() наблюдение = $strongestRSSI .sink { [слабое я] newValue in сам?.tableView.reloadData() } обновитьТаблевиев() rssiUpdateTimer = Timer.scheduledTimer (timeInterval: 1.0, цель: self, селектор: #selector (refreshTableView), userInfo: ноль, повторы: правда) RunLoop.current.add(rssiUpdateTimer!, forMode: .common) } func CentralManagerDidUpdateState (_ Central: CBCentralManager) { если Central.state == .poweredOn { // Начинаем сканирование периферийных устройств со значениями RSSI Central.scanForPeripherals(withServices: ноль, параметры: ноль) } } func CentralManager (_ Central: CBCentralManager, DidDiscover периферийное устройство: CBPeripheral, AdvertiseData: [String: Any], rssi RSSI: NSNumber) { // Обновляем значение RSSI при каждом обнаружении периферийного устройства rssiValue = RSSI.intValue // Возможно, вы захотите обновить здесь и свой источник данных } @objc func restartTableView() { DispatchQueue.main.async { self.filterDiscoveredDevices() self.filterDiscoveredDevicesRSSI() // Проверяем, изменился ли самый сильный RSSI и доступно ли самое сильное периферийное устройство если позволить сильнейшийRSSI = self.strongestRSSI, пусть сильнейшийпериферал = self.strongestPeripheral, пусть indexPath = self.indexPathForPeripheral(strongestPeripheral) { let cell = self.tableView.cellForRow(at: indexPath) как? Девицетаблевиевцелл cell?.rssiLabel?.text = "RSSI: \(strongestRSSI)" } self.tableView.reloadData() print("Табличное представление обновлено ====================================== HHHH") } } // Функция для поиска IndexPath для данного периферийного устройства частная функция indexPathForPeripheral (_ периферийное устройство: CBPeripheral) -> IndexPath? { for (индекс, устройство) в обнаруженномDevices.enumerated() { если устройство === периферийное { вернуть IndexPath (строка: индекс, раздел: 0) } } вернуть ноль } функция filterDiscoveredDevices() { обнаруженныеУстройства = обнаруженныеУстройства.фильтр {периферийное устройство в если пусть имя = периферийное имя { return ["00000534", "00000523", "00000525"].contains(имя) } вернуть ложь } } функция filterDiscoveredDevicesRSSI() { // Фильтруем обнаруженные устройства по именам let filteredDevices = DiscoverDevices.filter {периферийное устройство в если пусть имя = периферийное имя { return ["00000534", "00000523", "00000525"].contains(имя) } вернуть ложь } // Получение значений RSSI для отфильтрованных устройств для периферийного устройства в filteredDevices { периферийное устройство.readRSSI() } // Определить самое сильное значение RSSI среди отфильтрованных устройств вар сильнейшийRSSI: NSNumber? var сильнейшийLocation: String? для периферийного устройства в filteredDevices { если пусть rssi = rssiValues[периферийное устройство] { если самый сильныйRSSI == ноль || rssi.intValue > сильнейшийRSSI!.intValue { самый сильныйRSSI = rssi сильнейшееLocation = устройствоLocations[peripheral.name ?? ""] } } } // Обновляем самый сильный RSSI, используя @Published self.strongestRSSI = самый сильныйRSSI // Обновляем UILabel объединенной меткой var CombinedLabelText = «Сильнейший RSSI: н/д» если let сильнейшийRSSI = сильнейшийRSSI, пусть сильнейшийLocation = сильнейшийLocation { CombinedLabelText = "Сильнейший RSSI: \(strongestRSSI), Местоположение: \(strongestLocation)" } сильнейшийRSSILabel.text = комбинированныйLabelText } // Реализуем методы BluetoothManagerDelegate func bluetoothManager (_ менеджер: BluetoothManager, периферийное устройство DidDiscoverPeripheral: CBPeripheral, withRSSI RSSI: NSNumber) { если !discoveredDevices.contains(периферийное устройство) { rssiValues[периферийное устройство] = RSSI обнаруженныеУстройства.append(периферийное устройство) фильтрОбнаруженныеУстройства() фильтрОбнаруженныеУстройстваRSSI() tableView.reloadData() // Проверяем, сильнее ли RSSI текущего самого сильного RSSI если самый сильныйRSSI == ноль || RSSI.intValue > сильнейшийRSSI!.intValue { самый сильныйRSSI = RSSI сильнейшийпериферийный = периферийный } } } функция обновленияRSSIValues() { для периферийного устройства в обнаруженных устройствах { периферийное устройство.readRSSI() } } func bluetoothManager (_ менеджер: BluetoothManager, DidStartAdvertisingPeripheral успех: Bool) { если успех { // Начать рекламу } еще { // Обработка сбоя рекламы } } // Реализуем методы UITableViewDelegate и UITableViewDataSource func tableView (_ tableView: UITableView, раздел NumberOfRowsInSection: Int) -> Int { вернуть обнаруженныйDevices.count } func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "DeviceCell", for: indexPath) as! Девицетаблевиевцелл пусть периферийное = обнаруженные устройства[indexPath.row] cell.nameLabel?.text = "Имя устройства: \(peripheral.name ?? "Безымянное устройство")" cell.uuidLabel?.text = "UUID: \(peripheral.identifier.uuidString)" // Получаем значение RSSI из словаря если пусть rssi = rssiValues[периферийное устройство] { cell.rssiLabel?.text = "RSSI: \(rssi)" } еще { cell.rssiLabel?.text = "RSSI: Н/Д" } если let location = deviceLocations[peripheral.name ?? "Имя устройства"] { cell.locationLabel?.text = "Местоположение: \(location)" } еще { cell.locationLabel?.text = "Местоположение: Н/Д" } возвратная ячейка } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»