方法addObserver(_:selector:name:object:)
和post(name:object:userInfo:)
都包括一個「對象」參數。相應的文檔將對象參數描述爲「觀察者希望接收其通知的對象;也就是說,只有該發送者發送的通知被傳送給觀察者」,並且「[對象]發佈通知「。這些描述給我的印象是,對象「參數」(如果未設置爲零)必須是調用該方法的同一個對象。iOS通知 - 對象參數可以是任意任意對象嗎?
但是,在實踐中,似乎方法可以包括任何任意對象作爲其對象參數。同時,addObserver()
方法可以用任意的對象來設置。因此,如果post()
和addObserver()
方法引用相同的任意對象(並具有相同的Notification.Name),它們應該發送和接收。在實驗中,這似乎工作得很好。
在以下示例中,Observer註冊爲從任意發件人接收特定通知。但是,Store是發佈通知的商店。在發佈通知時,Store包含與「發件人」對象相同的任意時間。觀察員收到通知。即使存儲(而非任意)是通知的「發件人」,這也可以工作。
class ArbitraryData {
var data: [String] = ["some handy info"]
func getMoreInfo() {
Store.aSyncReadData(self)
}
}
class Observer {
let arbitrary = ArbitraryData()
func initiate() {
NotificationCenter.default.addObserver(self, selector: #selector(handleNotice),
name: NSNotification.Name(rawValue: "eventHappenedNotice"),
object: arbitrary)
... do stuff ...
arbitrary.getMoreInfo()
}
func handleNotice(notice: Notification) {
for infoItem in arbitrary.data {
print(infoItem)
}
}
}
class Store {
static func aSyncReadData(dataObject: ArbitraryData) {
ServerAPI.getSomeDataFromPersistentStore(completionHandler: { newData in
dataObject.data.append(newData)
NotificationCenter.default.post(NSNotification.Name(rawValue: "eventHappenedNotice"),
object: dataObject)
})
}
}
這是使用的預期功能性的任意對象部分,並且是它的安全?或者,是否使用了一個可能導致某種失敗的任意對象,可能以後難以調試?
@MuseerAnsari - 感謝您的編輯。我將盡力按照風格指南更加緊密地前進。 –