洪小瑤學iOS-NSNotificationCenter 詳解

來源:互聯網
上載者:User

Notificationcenter的用法:

【原】NSNotificationCenter未必一定要建在訊息接收者的類中。可以放在別的類中,先執行個體化一下,然後把observer賦值為剛對象。

這裡的observer相當於接受者(receiver),object相當於寄件者(poster)。理解了這點就可以較靈活地使用通知了。

iPhone軟體開發的時候會遇到這種情況:開啟APP後會在後台運行某個方法,例如下載檔案,下載完成後可能需要調用某個方法來重新整理介面,這時候可能沒法在下載的函數中回調。NSNotificationCenter(通知)是一個很好的選擇。

通知使用起來灰常的簡單:

1、定義通知:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(callBack)     name: @"back"    object: nil];

2、定義通知中使用的方法:

- (void)callBack{NSLog(@"i am back.");}

3、調用通知:

- (void)getIT{NSLog(@"get it.");//發出通知[[NSNotificationCenter defaultCenter] postNotificationName:@"back" object:self];}

 

notificationcenter的講解

【轉自】http://www.devdiv.com/home.php?mod=space&uid=82357&do=blog&id=3835

Notifications

Notification 封裝了事件的資訊, 比如視窗正在擷取焦點或者網路連接正在斷開. 需要訂閱事件(例如, 一個檔案想要知道正在編輯它的視窗將要被關閉)的object需要在notification center註冊, 之後當事件發生的時候就會得到通知. 當事件發生的時候, 一個notification會被發送到notification center, 而後notification center馬上就會把這個notification轉寄給所有訂閱過這個事件的object. 當需要的時候, notification會被緩衝在notification queue中….

Notification的原理

在 兩個object之間傳遞資訊最標準的方法是傳遞訊息 – 一個object調用另外一個object的方法. 但是, 傳遞的訊息這種方法要求發送訊息的object知道訊息的接收者和它能接收的訊息類型. 這將會把兩個object緊密的綁定起來 – 最值得注意的是這會讓兩個本來獨立的子系統耦合在一起. 為瞭解決這些問題, 廣播模型被提了出來. Object只是負責發送notification, 而NSNotificationCenter將負責把這個notification轉寄給所有相關的object.

一個 NSNotification(在這片文章裡面簡稱notification)包含一個name, 一個object和一個可選的dictionary. Name是notification的標識. Object包含notification寄件者想要發送的任意類型的object(一般來說就是發送這個notification的object本 身). Dictionary用來儲存其他相關的東西(如果有的話).

任意object都可以發送notification. 任意object都可以在notification center註冊以便在某個事件發生的時候能夠得到通知. Notification center負責把接受的notification發送給所有註冊過的訊息接收者. 發送notification的object, notification裡麵包含的object和接收這個notification的object可以是同一個object, 也可以是三個不同的object. 發送notification的object不需要知道關於接受者的任何資訊. 但是, 接受者至少需要知道notification的name和其所包含dictionary的key(如果有的話).

Notification和Delegation

就使用上看, notification系統和delegate很像, 但是他們有以下不同:

*Notification的接受者可以是多個object. 但是delegate object只能有一個. 這就阻止了傳回值.
*一個object可以從notification center接受它想要的任意數量個notification, 而delegate只能接受預先定義好的delegate方法.
*發送notification的object完全不知到接受者是否存在.

Notification Centers

Notification center負責接收和發送notification. 當它接受到notification的時候會通知所有符合特定條件的接受者. Notification資訊被封裝在NSNotification裡. Notification接收者在notification center裡面註冊以獲得其他object發出的notification. 當事件發生的時候, 一個object發送相關的notification到notification center. Notification center將訊息分發給每一個註冊過的接受者. 發送notification的object和接受者可能是同一個.

Cocoa包含兩種notification center:

*NSNotificationCenter類管理單個進程內部的notification.
*NSDistributedNotificationCenter管理一台機器上跨進程的notification.

NSNotificationCenter

每 一個進程都有一個預設的notification center, 你可以通過訪問 NSNotificationCenter 的 +defaultCenter方法來得到它. 這種類型的notification center負責管理單個進程內部的notification. 如果需要管理同一台機器上不同進程之間的notification則需要用到NSDistributedNotificationCenter.

Notification center發送notification給接收者的方法是同步的. 也就是說, 當發送一個notification的時候, 除非所有的接收者都接到和處理了這個notification, 否則不會返回. 想要發送非同步notification的話就需要用到notification queue了.

在一個多線程應用程式裡, notification總是和寄件者處於同一個線程裡, 但是接受者可以在其他線程裡.

NSDistributedNotificationCenter

每 一個進程都有一個預設的distributed notification center, 你可以通過訪問 NSDistributedNotificationCenter 的 +defaultCenter方法來得到它. 這種類型的notification center負責管理一台機器上多個進程之間的notification. 如果需要在多台機器間通訊的話, 使用distributed objects.

發送一個distributed notification是非常昂貴的. Notification首先會被發送到一個系統層級的伺服器上, 然後在分別分發到每一個註冊過的進程裡. 從發從訊息到訊息被接受到之間的延遲理論上來說是無限的. 事實上, 如果太多的notification被發送到伺服器上, 那麼伺服器上的notification隊列可能會被撐滿, 這就有可能會造成notification的丟失.

Distributed notification會在一個進程的主迴圈裡被發送出去. 一個進程必須保證有一個主迴圈在其內部運行, 例如 NSDefaultRunLoopMode, 然後才能接受到distributed notification. 如果接收進程是多線程的, 那麼notification並不一定會被主線程接受到. 一般來說notification會被分發到主線程的主迴圈, 但是其他線程一樣可以接收到.

一 般類型的notification center可以註冊所有object的notification, 但是 distributed notification center只能註冊字串類型的notification. 因為寄件者和接受者可能在不同進程裡, notification裡麵包含的object不能保證指向同一個object. 所以, distributed notification center只能接受包含字串類型的notification. Notification會基於字串來匹配.

NotificationCenter的使用 

1. 定義一個方法

update

2.訂閱通知

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) name:@"update" object:nil]

3. 在要發出通知訊息的地方

[[NSNotificationCenter defaultCenter] postNotificationName:@"update" object:nil];

----------------------------

虛擬鍵盤顯示和消失的通知

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasShown:)

name:UIKeyboardDidShowNotification

object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasHidden:)

name:UIKeyboardDidHideNotification

object:nil];

------

- (void)keyboardWasShown:(NSNotification *) aNotification{

if(keyboardShown)

return;

NSDictionary *info = [aNotification userInfo];//擷取通知資訊

//get the size of the keyboard.

NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

//Resize the scroll view

CGRect viewFrame = [scrollView frame];

viewFrame.size.height -= keyboardSize.height;

//Scroll the active text field into view

CGRect textFieldRect = [activeField frame];

[scrollView scrollRectToVisible:textFieldRect animated:YES];

keyboardShown = YES;

}

//Called when the UIKeyboardDidHideNotification is sent

- (void)keyboardWasHidden:(NSNotification *) aNotification{

NSDictionary *info = [aNotification userInfo];

//Get the size of the keyboard.

NSValue *aValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

//Reset the height of the scroll view to its original value

CGRect viewFrame = [scrollView Frame];

viewFrame.size.height += keyboardSize.height;

scrollView.frame = viewFrame;

keyboardShown = NO;

}

官方文檔說明如下:

postNotificationName:object:userInfo:

Creates a notification with a given name, sender, and information and posts it to the receiver.

- (void)postNotificationName:(NSString *) notificationName object:(id) notificationSender userInfo:(NSDictionary *) userInfoParameters
notificationName

The name of the notification.

notificationSender

The object posting the notification.

userInfo

Information about the the notification. May be nil.

從以上可以看出,object表示寄件者!!而不是要發送的參數。要發送的參數可以放到information裡面,是NSDictionary類型的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.