2017-04-25 11 views
1

私はobjectパラメータが、私はそれを正しく理解していれば、それは一種のフィルタとして機能しNotificationCenter.default.addObserver(observer:selector:name:object)NotificationCenter addObserver(observer:selector:name:object) - オブジェクトとは何ですか?

にあるものを理解トラブルを抱えています。このオブジェクトから通知された通知のみが監視されます。しかし、私は実際にそれを使用する方法を把握することはできません。

私はその後、私の最初のViewControllerに私はそうのように登録し、私の第二のViewControllerに続いてglobalFoo.postNotification()

を呼び出すボタン押してクラスを作成し、

class FooClass { 
    func postNotification() { 
     NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), object: self) 
    } 
} 

let globalFoo = FooClass() 

それのグローバルインスタンスを作った:

class SecondViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     NotificationCenter.default.addObserver(self, selector: #selector(notificationReceived), name: NSNotification.Name("TestNotification"), object: globalFoo) 

    } 

    func notificationReceived() { 
     print("notification received") 
    } 

} 

object(つまり、nil)を指定しないとうまく動作しないので、私はそれが何であるか誤解しています。

+1

最後の編集をロールバックしました。あなたの質問を編集して答えを表示するのではなく、単に答えを受け入れるだけです。 – rmaddy

答えて

3

通知を送信するときに使用されるobjectパラメータは、どのオブジェクトが通知を実際に送信しているかを示すためのものです。

オブザーバーを追加するときには、objectをnilにすると、実際に通知を送信したオブジェクトに関係なく、指定されたすべての通知が取得されます。また、オブザーバーを追加するときに特定のオブジェクトを指定すると、その特定のオブジェクトが指定された通知を送信したときに通知されます。

+0

ええと...それは送信者と受信者としてglobalFooを指定したときに行っていたものです。 – MH175

+1

'FooClass'のインスタンスで' postNotification'を呼び出す前に、View Controllerの 'viewDidLoad'メソッドが呼び出されていることを確認してください。 – rmaddy

+0

ありがとうございます。それが問題でした。それは期待どおりに動作します。乾杯。 – MH175

1

一部の通知では、にさらに適切な情報を提供するためにこのパラメータが使用されています。

たとえば、NSManagedObjectContextObjectsDidChangeのような通知は、オプションでNSManagedObjectContextオブジェクトを受け入れ、そのコンテキストからの変更のみを通知できるようにします。

+0

それは私がドキュメントを読んで理解したものです。しかし、送信者と受信者と同じグローバルオブジェクトを指定すると、上の例のように動作しないのはなぜですか? – MH175

関連する問題