2016-12-13 3 views
1

フォアグラウンドになるたびに私のアプリケーションの表示を更新したいと思います。私はViewDidLoadに次のコードを使用していますが、うまく動作しているようです。NotificationCenter addObserver

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateDisplay), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) 

いつでもオブザーバーを削除する必要がありますか?

+0

ここには、「通知センター」オブザーバーに関する興味深いビデオがあります。彼らは終わり近くにそれらを取り除くための別のアプローチについて議論します:https://talk.objc.io/episodes/S01E27-typed-notifications-part-1 – ganzogo

+0

@ヒトマイド:Sunil Chauhanは正しかった、あなたは彼の答えを受け入れることができます。 iOS 9デバイスのコードを試して、通知センターが登録されたオブジェクトのメソッドを起動しないことに気付きました! iOS 9とiOS 10でメソッドベースとブロックベースの両方のAPIがテストされていますが、両方とも絶対に問題ありません。もうオブザーバを削除する必要はありません –

答えて

0

viewWillDisappearメソッドでNotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)と電話することができます。 しかし、これはあなたが他にその画面から移動するとき、あなたのオブザーバーを削除するので、あなたは、その画面のために再度オブザーバを追加する場合とそうでない場合は、常にそれを削除することをお勧めをご

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateDisplay), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)からviewWillAppear

その移動しますあなたの画面がスタックにあり、アプリケーションがフォアグラウンドになっている限り、それは何度もそのメソッドを呼び出そうとします。

+0

背景から来るときにviewWillAppearが呼び出されますか? – Humanoid

+0

はい、通知を追加したコントローラと同じコントローラにいると、最初にアプリケーションがフォアグラウンドに入り、フォアグラウンドが呼び出され、次にviewWIllAppearが表示されます – Pushkraj

-1

あなたのViewControllerにその信号を伝えるには、AppDelegateのapplicationWillEnterForegroundを使うべきだと思います。通知センターの関与は一切不要

+0

アプリケーションがフォアグラウンドに入るとapplicationWillEnterForegroundが実行されます。ただし、VCで変更を加えるには、通知でVCに通知するのが最も効率的です。ただし、その時点でVCがアクティブであることは必ずしも確かではありません。だから、Sandeep Bhandariのソリューションはより論理的に聞こえる。 – Vincent

1

iOS 9.0以降、オブザーバーを削除する必要はありません。 NSNotificationCenterとNSDistributedNotificationCenterは、もはや割り当てを解除することができる登録オブザーバーに通知を送信しません9.0 OS X 10.11とiOSではこのrelease note:

を見てみましょう。オブザーバがゼロ化弱参照として格納できる場合、オブジェクトを弱く格納できない場合(つまり、実行時を妨げるカスタム保持/解放メカニズムがある場合)、基礎ストレージはオブザーバをゼロ化弱参照として格納します。オブジェクトを弱く格納することができなくなる)、非弱ゼロ設定参照としてオブジェクトを格納します。これは、オブザーバが解除メソッドで登録を解除する必要がないことを意味します。そのオブザーバにルーティングされる次の通知は、ゼロ参照を検出し、オブザーバを自動的に登録解除する。オブジェクトを弱く参照することができる場合、割り当て解除中にオブザーバに通知が送信されなくなります。 dealloc中の通知を受け取る以前の振る舞いは、非弱参照参照オブザーバの場合には依然として存在する。 - [NSNotificationCenter addObserverForName:object:queue:usingBlock]メソッドを使用したブロックベースのオブザーバは、システムがまだこれらのオブザーバへの強い参照を保持しているため、使用されなくなった時点で未登録にする必要があります。オブザーバー(弱参照または参照参照)を早期に削除することは引き続きサポートされています。オブザーバはオブジェクトではない可能性があるため、CFNotificationCenterAddObserverはこの動作に準拠しません。

+1

非常に良い観察、今日何か新しいことを学んだ!もし私ができれば、私はこれを答えとして受け入れていたと思いますが、それで私は投票できません:D –

関連する問題