2017-02-01 83 views
0

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

這是使用的預期功能性的任意對象部分,並且是它的安全?或者,是否使用了一個可能導致某種失敗的任意對象,可能以後難以調試?

+0

@MuseerAnsari - 感謝您的編輯。我將盡力按照風格指南更加緊密地前進。 –

回答

0

我想你誤解了你正在做的一些事情。

首先在您的示例中,Store不是發佈通知的人,而是發佈通知的人的ArbitraryData

爲了解釋多一點:

如果你使用當您註冊/發佈通知object參數,該通知將被接收/發送僅用於註冊對象等於對象張貼通知。因此,如果您同時使用nameobject參數來註冊/發送通知,則nameobject必須相同才能進行正確的通知通信。

如果您不使用object參數,那麼唯一的檢查將應用於名稱。

因此,例如,你的情況,如果您使用的ArbitraryData兩個不同的實例,其不相等,一個寄存器和一個用於發佈,您的通知將無法正常工作。

+0

謝謝。我想你已經幫助我理解了這個意圖。可以肯定的是:通過將「任意數據」對象作爲「對象」參數傳遞給'post()',它確定任意數據是發佈通知的對象,是否正確?作爲必然結果,是否正確地說,如果將nil傳遞給'post()'mehtod,那麼沒有任何對象發佈通知? –

+0

在我看來,這兩個陳述都是安全和真實的。 – danypata