Ячейка таблицы выбрана, но не выполнялся ли параметр SelectPowAt indexPath иногда и вызывает блокировку?

[РЕДАКТИРОВАТЬ]: Я думаю, что я решил проблему блокировки. Во время рефакторинга didSelectRowAt При подготовке к выходу в качестве задачи блокировки в асинхронной очереди ping я заметил, что успешные переходы будут состоять из одного мгновенного перехода к rootVC, за которым следует еще один анимированный переход к rootVC. Заставил меня осознать, что у меня было два segues из моего tableVC: один от общего контроллера до segue контроллера (который является предполагаемым методом segue) и один от выбора ячейки таблицы.

Я не уверен, что решение проблемы было решено только удалением дополнительной передачи или сочетанием нескольких попыток решения И удалением передачи. Мое предположение - последнее, поскольку память говорит мне, что было время, когда был только один переход, и "исправления" тогда тоже не работали.

tl; dr: убедитесь, что у вас нет конкурирующих сегментов и что ваш асинхронный код является поточно-ориентированным / правильно очищен.

[ПРОБЛЕМА]:

У меня есть TableViewController, который является дочерним VC rootVC под контроллером навигации. Другими словами, NavController [rootVC, tableVC].

Приложение запускается в rootVC и переходит в tableVC через UIButton. В tableVC viewDidLoad выполняется сканирование сети, если ранее ни одно сканирование не было завершено. Устройства в сети проверяются на определенном порту асинхронно, поскольку они обнаружены. Если эти эхо-запросы успешны, IP-адрес, связанный с устройством, используется для заполнения ячейки в табличном представлении. Если эта ячейка выбрана, некоторые настройки приложения изменяются с помощью didSelectRowAt indexPath, и выполняется возврат, чтобы вернуться к rootVC. viewWillDisappear также используется для передачи значений через isMovingFromParentViewController (ранее это делалось при подготовке к segue, но также присутствовала ошибка). Пользователь может выбрать ячейку IP-адреса, как только она появится в табличном представлении, которое предназначено для проектирования.

Эта функциональность все работает. Большую часть времени. Тем не менее, приложение блокирует ИНОГДА после выбора ячейки, когда ячейка выбрана, пока сканирование не выполнено (это будет означать, что асинхронные пинги все еще могут происходить / ставиться в очередь). У меня есть печать в начале didSelectAtRow, которая никогда не происходит, когда происходит блокировка. У меня также есть представление индикатора активности в табличном представлении, которое продолжает вращаться, когда все остальное не отвечает. Там нет сбоя или перерыва со стороны XCode. Кажется, что didSelectAtRow просто не происходит и не может продолжаться по какой-то причине.

Вот так выглядит мой didSelectAtRow

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Cell was selected")
    if possibleDevices.count != 0 {
        selectedTableCellAddress = possibleDevices[indexPath.row]
        let defaults = UserDefaults.standard
        // Set the current cell's IP Address to the setting's IP Address
        if selectedTableCellAddress != nil {
            pingOperationsShouldStop = true
            lanScanner.stop()
            defaults.set(selectedTableCellAddress, forKey: "address")
        }
    }
}

Обратите внимание, что lanScanner является экземпляром MMLanScan

Мои знания новичка дают мне предположение, что это связано с моими асинхронными пингами (результаты пинга - последние вещи, которые появляются на консоли). Асинхронные функции выполняются при обнаружении устройства в локальной сети. Он заключен в такую ​​функцию:

    DispatchQueue.global(qos: .userInteractive).async {
        print("pingOperationsShouldStop? \(self.pingOperationsShouldStop)")
        if self.pingOperationsShouldStop {
            print("Skipping ping for \(addr)")
            return
        }
        self.pingOperationsHaveStopped = false
        let port = Int32(self.portStr)
        let client = TCPClient(address: address, port: port!)
        switch client.connect(timeout: 1) {
        case .success:
            print("connected")
            DispatchQueue.main.sync {
                self.possibleDevices.append(address)
                self.numberOfPossibleDevicesCounted += 1
                self.pingOperations.leave()
            }
            client.close()
        case .failure(let error):
            print("failed due to \(error) for \(addr)")
            DispatchQueue.main.sync {
                self.numberOfPossibleDevicesCounted += 1
                client.close()
                self.pingOperations.leave()
            }
        }
    }

Заметьте, что возможный прибор имеет наблюдатель свойства didSet, который вызывает reloadData.

Сначала я подумал, что это происходит только при выборе ячейки (т. Е. Back NavCon работал нормально). Поэтому я программно назвал сование вида, но безрезультатно. Я попытался воспроизвести блокировку с помощью кнопки Назад NavCon и смог сделать это один раз.

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

Спасибо!

0 ответов

Другие вопросы по тегам