Как обновить пользовательский интерфейс, когда приложение находится на переднем плане? - PullRequest
0 голосов
/ 14 января 2019

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

func updateCell(path: Int, messageId: String) {
    let indexPath = IndexPath(item: path, section: 0)
    if let visibleIndexPaths = mainTableView.indexPathsForVisibleRows?.index(of: indexPath as IndexPath) {
        if visibleIndexPaths != NSNotFound {
            if let id = self.userData?.id {
                let conversationID = String(describing: id)
                ServerConnection.getSpecificMessage(conversationId: conversationID, messageId: messageId) { (dataMessage) in
                    if let message = dataMessage {
                        self.chat[path] = message
                        self.mainTableView.beginUpdates()
                        self.mainTableView.reloadRows(at: [indexPath], with: .fade)
                        self.mainTableView.endUpdates()
                    }
                }
            }
        }
    }
}

Моя проблема в том, что когда мое приложение находится на переднем плане, поток больше не работает из-за запроса API, который не может быть выполнен на переднем плане / фоне.

Журнал консоли показывает:

загрузка не удалась с ошибкой Ошибка Домен = NSPOSIXErrorDomain Код = 53 "Программное обеспечение вызвало прерывание соединения"

Я пытался изменить свою функцию с помощью

let state = UIApplication.shared.applicationState
    if state == .background || state == .inactive {
        NotificationCenter.default.addObserver(self, selector: #selector(self.reloadData(_:)), name: NSNotification.Name("BackgroundReload"), object: nil)
    }

и разместил это уведомление "BackgroundRelod" в AppDelegate

func applicationWillEnterForeground (_ application: UIApplication)

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

1 Ответ

0 голосов
/ 14 января 2019

Вы не должны зависеть от фонового режима в обновлениях, вам нужно изменять только переменную, скажем, needsUpdate всякий раз, когда в фоновом режиме появляется уведомление

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

Тогда

NotificationCenter.default.addObserver(self, selector: #selector(update), name: UIApplication.willEnterForegroundNotification, object: nil)

@objc func ppp(_ no:NSNotification) {

    if needsUpdate {

        // pull here
    }

}
...