[iOS] Notification Programming Topics --- Posting a Notification

此份文件為個人學習通知中心的翻譯,內文請參考蘋果官方文件,若有翻譯錯誤請見諒,請勿挪作商業用途,並著明出處。
 

你可以在你自己的應用程式中貼出通知,或是讓其他應用程式可取得這些通知。前者可參考“Posting Local Notification ,後者可參考Posting Distributed Notification

Posting Local Notifications


你可以用notificationWithName:object:或是notificationWithName:object:userInfo:來創建一個通知物件。然後用postNotification:實例方法張貼通知物件到通知中心。NSNotification物件不可修改,所以一旦創建了,它們就不能被修改。然而,正常來說你不會直接創建你自己的通知。NSNotificationCenter類別的postNotificationName:object:和postNotificationName:object:userInfo:方法允許你可以方便的張貼通知而不用先創建。這兩種情況,你通常是把通知張貼到程序預設的(process’s default)通知中心。使用defaultCenter類別方法可以獲得預設物件。一個使用通知中心去張貼通知的例子,可以考慮”Registering for Local Notifications裡面的例子。假設你有一個程式,這程式可以執行許多文字的轉換(舉例來說,RTF轉換成ASCII)。轉換是由一個物件的類別(Converter,轉換器)來處理,程式執行時它可以加入或是移除(文字)。在你的程式中可能有其他的物件需要你在執行加入或移除時知會它們,但是轉換器物件不需要知道是哪些物件或是它們要作什麼。因此,你宣告兩個通知:"ConverterAdded"和"ConverterRemoved",當特定的事件發生時,就會貼出。

當使用者安裝(install)或移除(remove)轉換器時,以下訊息的其中一個會被傳送到通知中心去:

[[NSNotificationCenter defaultCenter]
postNotificationName:@"ConverterAdded" object:self];
 

 
[[NSNotificationCenter defaultCenter]
postNotificationName:@"ConverterRemoved" object:self];

接著通知中心會識別哪些物件(若有的話)對這些通知有興趣並通知它們。若有觀察者對其他物件有興趣(除了通知名稱和觀察物件(observed object)),把它們放在通知的選擇性字典(notification’s optional dictionary)或使用postNotificationName:object:userInfo:。

Posting Distributed Notifications


張貼distributed notifications和張貼local notifications.很像。你可以手動創建NSNotification物件並用postNotification:張貼或是用NSDistributedNotificationCenter裡面的便利方法。唯一的差別是通知物件必須是一個字串物件並且選擇性的user-info字典(optional user-info dictionary)只可以包含屬性列表物件,像是NSString和NSNumber。

特定通知的觀察者可能處於暫停狀態,而且不能立即處理通知。如果張貼通知的物件想確認所有觀察者都立刻接收到通知(舉例來說,像是關閉警告的通知),它可以調用postNotificationName:object:userInfo:deliverImmediately:方法並且deliverImmediately:YES。通知中心傳遞通知就好像觀察者是註冊NSNotificationSuspensionBehaviorDeliverImmediately(更清楚的描述請參考ochRegistering for Distributed Notifications)。然而,並不會傳遞。舉例來說,接收通知的程序(process)可能太忙而無法處理(process)和接收queued通知。在這情況下,通知會被取消(dropped)。

留言