2016-12-13 17 views
2

Arduinoボードを使用してIoTアプリケーションを構築し、APIを呼び出してArduinoボードの更新されたピン値を確認してください。ViewDidアプリケーションがフォアグラウンドになるたびに実行されない

私はAPIからのアップデートを受け取ると、私が受け取っているデータに応じてボタンの色を赤または緑に更新する必要があります。初めてアプリケーションを読み込むと、うまく動作し、viewDidAppear()が呼び出されます。しかし、私はバックグラウンドに行くと、再びフォアグラウンドに行くときに呼び出されません。私が知っていることは、ビューが表示されるたびに関数内の命令を実行しなければならないが、そうでないように思えるということです。

AppDelagateapplicationDidBecomeActive()にコードを書き込もうとしましたが、私のビューを更新しようとしていてビューがまだ存在しないため、致命的なエラーが発生しました。ここで がviewDidAppearに加えて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

で私の指示している、あなたはあなたのビューコントローラが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'インスタンスを作成していません。私は 'default'シングルトンを使用しています。私がやっているのは、その通知センタにオブザーバを追加し、そのオブザーバ(中央ではない)への参照を保存して、そのオブザーバを 'deinit'で削除できるようにすることです。なぜそれを行うのかという点では、オブジェクトが割り当て解除されたときに通知センターに通知の送信を停止するよう伝えることが歴史的に重要でした。おそらく、これは割り当て解除されないルートビューコントローラーですが、コードを任意のコンテキストで使用できるように自分で後でクリーンアップするだけの良い方法です。 – Rob

+0

オブザーバーを追加して削除する例については、['addObserver(forName:object:queue:using:)'](https://developer.apple.com/reference/foundation/notificationcenter/1411723-addobserver)のドキュメントを参照してください。 – Rob

関連する問題