有一個更好的地方可以將對象註冊到通知中心?將對象註冊爲通知偵聽器? - 最大化性能!
換句話說,對於性能問題,在init(),awakeFromNib()或其他事件處理程序中將對象註冊爲通知監聽器是一種很好的做法?
謝謝!
有一個更好的地方可以將對象註冊到通知中心?將對象註冊爲通知偵聽器? - 最大化性能!
換句話說,對於性能問題,在init(),awakeFromNib()或其他事件處理程序中將對象註冊爲通知監聽器是一種很好的做法?
謝謝!
在您的代碼正常工作之前,不要擔心性能問題,並且您可以觀察和測量您可能遇到的任何性能問題。註冊觀察員是很少出現的,所以當你這樣做時不應該涉及重大的性能問題。可能很重要的是您註冊通知的對象數量以及您要發送的通知數量,因爲發佈通知涉及到哈希查找。
沒有真正的性能差異,您可以通過在不同的時間註冊通知來注意到。我可以給你的唯一建議是儘可能縮短通知被觀察窗口的時間。另外,請確保您只註冊一次觀察員。如果您多次註冊觀察員,您會收到多個通知。
爲什麼你如此關心通知的性能?您是否通過測量確認通知導致問題?
另外,在init方法中使用塊作爲通知處理程序時要非常小心。例如,您可以將塊設置爲通知處理程序,以偵聽來自類屬性的通知(例如視圖控制器的managedObjectContext上的didChangeNotification)。在這種情況下,塊將保留對象實例,這意味着您的init方法將retainCount遞增兩次。如果您沒有重寫發佈以正確管理此內容,那麼您將保留該類的實例,甚至可能仍會響應這些通知。
因此,我非常小心使用塊作爲通知處理程序,特別是從init方法。
感謝您的回答!是的,如果我在每個對象的init()方法中註冊所有通知,而是將它們註冊到awakeFromNib()或其他處理程序中,我注意到加載時間有一點點區別!我問過這個問題,看看有人有關於技術的解釋! – BitDrink 2009-11-10 15:48:04
BitDrink:不完全。不同之處在於,當你在'init'中執行時,你在UI出現之前就做到了,而當你在'awakeFromNib'中執行時,你會在你的UI出現後(部分)執行它。添加觀察者所需的時間不會消失;它只是在UI啓動後才移動。儘管如此,這仍然是一件好事,你應該儘量做一些事情。 – 2009-11-10 16:53:19