addObserver(_:selector:name:object:)
和post(name:object:userInfo:)
方法都包含"对象"参数。相应的文档将对象参数描述为" [t]对象,其观察者想要接收的通知;也就是说,只有此发件人发送的通知才会传递给观察者,"和#34; [t]他反对发布通知。"这些描述给我的印象是对象"参数,"如果未设置为nil,则必须是调用post()
方法的同一对象。
但是,实际上,post()
方法似乎可以包含任意对象作为其对象参数。同时,可以使用任意对象设置addObserver()
方法。因此,如果post()
和addObserver()
方法引用相同的任意对象(并且具有相同的Notification.Name),则它们应该用于发送和接收。在实验中,这似乎工作正常。
在以下示例中,Observer注册以从发送方任意接收特定通知。但是,Store是发布通知的那个。在发布通知时,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)
})
}
}
使用任意对象是否是预期功能的一部分,是否安全?或者,使用任意对象是否可能导致某种类型的故障,以后可能难以调试?
答案 0 :(得分:1)
我觉得你误解了一下你在做什么。
首先,在您的示例中,Store
不是发布通知的人,而ArbitraryData
是发布通知的人。
再解释一下:
如果在注册/发布通知时使用object
参数,则仅当用于注册的对象等于发布通知的对象时才会接收/发送通知。因此,如果您同时使用name
和object
参数来注册/发送通知,则name
和object
必须相同才能进行正确的通知通信。
如果您不使用object
参数,则唯一的检查将应用于名称。
例如,在您的情况下,如果您使用两个不同的ArbitraryData
实例,一个用于注册,一个用于发布,则您的通知将无效。