2015-11-10 26 views
1

我正在寫一個SDK並尋找通過NSNotification發送對象的最佳做法。通過[[NSNotificationCenter defaultCenter] postNotificationName]方法直接傳遞對象是否危險?

Apple和一些線程包括this表示參數postNotificationNamer應該是通知的發件人,這在大多數情況下是self。並且您的自定義對象應該通過userInfo NSDictionary傳遞。來自Apple文檔:

創建具有給定名稱,發件人和信息的通知並將其發佈給接收方。

例如,不恰當的做法是:

[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" 
                object:myObject]; 

和推薦的方法是:

NSDictionary* userInfo = @{@"myMessage": myObject}; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" 
                object:self 
                userInfo:userInfo]; 

我已經試過這兩種方法,他們都很好地工作。問題是,使用以前的方法有沒有風險?在我的情況下,我對通知的發件人不感興趣,但使用後一種方法在我想發送的實際對象周圍引入了一個附加包裝(NSDicionary)。

回答

3

這不是危險使用對象參數,必須記住,NSNotificationCenter使用該參數內部來決定一些事情。所以如果你的代碼依賴於以某種順序或某些隊列運行的東西,那麼可能表現出意外。

下面是來自NSNotificationCenter Class Reference相關報價:

對象要塊添加到操作隊列誰的通知。

如果傳遞零,通知中心不使用通知的發送者決定是否將塊添加到操作隊列。

我會建議您使用userInfo作爲預期的,但它並不危險。

2

後者更靈活。雖然你現在可能不關心發件人,但這可能會改變。你可能以後會發現你需要傳遞額外的信息。

更好地做到這一點的前期。不需要額外的努力就可以第一次做到這一點,並且當您的需求發生變化時,必須付出很大的努力(並且容易出錯),必須返回並重構一堆代碼。

另外,使用後一種方法意味着您的代碼與其他框架中的完成方式是一致的。一致性使代碼更易於閱讀和維護。你不必思考,「在這種情況下,我在這裏得到對象,但在這種情況下,我得到它」。

相關問題