iOS通知 - 对象参数可以是任意对象吗?

时间:2017-02-01 08:30:29

标签: ios swift cocoa nsnotificationcenter

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)
        })
    }
}

使用任意对象是否是预期功能的一部分,是否安全?或者,使用任意对象是否可能导致某种类型的故障,以后可能难以调试?

1 个答案:

答案 0 :(得分:1)

我觉得你误解了一下你在做什么。

首先,在您的示例中,Store不是发布通知的人,而ArbitraryData是发布通知的人。

再解释一下:

如果在注册/发布通知时使用object参数,则仅当用于注册的对象等于发布通知的对象时才会接收/发送通知。因此,如果您同时使用nameobject参数来注册/发送通知,则nameobject必须相同才能进行正确的通知通信。

如果您不使用object参数,则唯一的检查将应用于名称。

例如,在您的情况下,如果您使用两个不同的ArbitraryData实例,一个用于注册,一个用于发布,则您的通知将无效。