2017-04-25 37 views
1

我無法理解object參數是什麼NotificationCenter.default.addObserver(observer:selector:name:object)NotificationCenter addObserver(observer:selector:name:object) - 什麼是對象?

如果我理解正確的話,它作爲一種過濾器;只有從這個對象發佈的通知纔會被觀察到。但我似乎無法真正弄清楚如何使用它。

我創建了一個類,並用它製成的全局實例

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

let globalFoo = FooClass() 

然後在我的第一個視圖控制器我按下一個按鈕,它調用globalFoo.postNotification()

然後在我的第二個視圖控制器我註冊了,像這樣:

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(即無),很顯然我誤解它是什麼。

+1

我回滾上次編輯。不要編輯你的問題來顯示答案,只需接受一個答案(如你所見)。 – rmaddy

回答

3

object參數張貼通知時的是表明什麼對象實際上是張貼通知。

當添加一個觀察者,你可以離開object零,你會得到所有的命名通知的無論哪個對象實際上發出的通知。或者,您可以在添加觀察者時指定特定對象,然後只有在該特定對象發佈指定通知時纔會通知您。

+0

嗯......這就是我雖然在指定globalFoo作爲發送者和接收者時所做的事情。 – MH175

+1

確保您的視圖控制器的'viewDidLoad'方法調用'postNotification'上FooClass'的'實例之前被調用。 – rmaddy

+0

謝謝。這是問題。它按預期工作。乾杯。 – MH175

1

某些通知使用這個參數來提供更合適的信息提供給observer

例如,像NSManagedObjectContextObjectsDidChange這樣的通知可以選擇接受NSManagedObjectContext對象,以便它只能從該上下文通知更改。

+0

對,這就是我通過閱讀文檔瞭解的內容。但是當我指定與發送者和接收者相同的全局對象時,爲什麼它在我上面給出的示例中不起作用? – MH175