2016-12-13 4 views
2

Im создает приложение IoT с помощью платы Arduino и вызывает API для проверки обновленных значений значков платы Arduino.ViewDidAppear не выполняется каждый раз, когда приложение выходит на передний план

Когда я получаю обновление от API, я должен обновить цвета кнопок до красного или зеленого в соответствии с данными, которые я получаю. Первый раз, когда я загружаю приложение, он работает отлично, и вызывается viewDidAppear(). Но когда я иду на задний план, то на передний план снова он не называется. То, что я знаю, это то, что при каждом представлении времени он должен запускать инструкции внутри функции, но похоже, что это не так.

Я попытался поместить свой код в AppDelagateapplicationDidBecomeActive(), но из-за того, что я пытаюсь обновить свои представления, а вид еще нет, он дает мне фатальную ошибку, найденную nil. Вот мои инструкции в viewDidAppear()

override func viewDidAppear(_ animated: Bool) { 

    activityIndicator.startAnimating() 

    definingPinModes(pin: [7,6,5,4], mode: 1) 

    getAllInputValues(key: key, method: .post) { (status, newValues, msg) in 

     if status == 200 { 
      //Change button colors according to values in array 
      self.changeButtonColors(values: newValues!) 

     } else { 

      print("Error getting pin values") 

      self.alertMessage(title: "Connection Error", message: "Failed retrieving pin values") 
      return 
     } 
     self.activityIndicator.stopAnimating() 
    } 

} 

ответ

2

В дополнение к viewDidAppear, вы можете иметь ваш контроллер представления наблюдать UIApplicationDidBecomeActive:

private var observer: NSObjectProtocol? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    observer = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] notification in 
     self?.updateUI() 
    } 
} 

deinit { 
    if let observer = observer { 
     NotificationCenter.default.removeObserver(observer) 
    } 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    updateUI() 
} 

private func updateUI() { 
    // do your UI update stuff here 
} 
+0

спасибо Роб первый раз, чтобы использовать эти наблюдатели. Но у меня возник вопрос о создании экземпляра самого NotificationCenter. Я сделал это, не создавая экземпляр, и необходимость вызова deinit. Почему ваш путь лучше, чем использование класса NotificationCenter напрямую? –

+0

Я не создаю экземпляр «NotificationCenter». Я просто использую singleton. Все, что я делаю, это добавить наблюдателя в этот центр уведомлений и сохранить ссылку на этого наблюдателя (а не на центр), чтобы я мог удалить этого наблюдателя в 'deinit'. С точки зрения того, почему вы это делаете, исторически было критично, что когда объект освобождается, он уведомляет центр уведомлений о прекращении отправки уведомлений. Теперь, возможно, это контроллер корневого представления, который не будет освобожден, но это просто хорошая практика для очистки после себя, чтобы код можно было использовать в любом контексте. – Rob

+0

См. Документацию ['addObserver (forName: object: queue: using:)'] (https://developer.apple.com/reference/foundation/notificationcenter/1411723-addobserver), например, добавления наблюдателей и их удаления. – Rob

Смежные вопросы