1. 程式人生 > >OC學習篇之---通知 NSNotificationCenter

OC學習篇之---通知 NSNotificationCenter

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

在前一篇文章中我們介紹了OC中很常用的兩個技術:KVC和KVO: http://blog.csdn.net/jiangwei0910410003/article/details/41912937,今天我們來看一下OC中另外的一個常用技術:通知(Nofitication)

其實這裡的通知和之前說到的KVO功能很想,也是用於監聽操作的,但是和KVO不同的是,KVO只用來監聽屬性值的變化,這個傳送監聽的操作是系統控制的,我們控制不了,我們只能控制監聽操作,類似於Android中系統傳送的廣播,我們只能接受。但是通知就不一樣了,他的監聽傳送也是又我們自己控制,我們可以在任何地方任何時機發送一個通知,類似於Android中開發者自己傳送的廣播。從這一點看來,通知的使用場景更為廣泛了。


下面就來看一下例子:

還是護士和小孩的那個例子

Children.h

////  Children.h//  44_KVO////  Created by jiangwei on 14-10-16.
//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>@interface Children : NSObject@property NSInteger *hapyValue;@end
定義了一個屬性:hapyValue


Children.m

////  Children.m//  44_KVO////  Created by jiangwei on 14-10-16.//  Copyright (c) 2014年 jiangwei. All rights reserved.
//#import "Children.h"@implementation Children- (id) init{    self = [super init];    if(self != nil){        //啟動定時器        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];        self.hapyValue= 100;    }    return self;}- (void) timerAction:(NSTimer *) timer{    //使用set方法修改屬性值,才能觸發KVO    _hapyValue--;    NSLog(@"%@",_hapyValue);    if(_hapyValue <80){        //傳送通知        //這裡和KVO的區別,我們可以手動的傳送通知        //注意通知的名稱,傳遞的引數必須和定義通知的地方的引數值要一致        //將Children物件傳遞過去        [[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];    }}@end
定義了一個定時器,但是我們看到這裡的timerAction方法中就開始傳送一個通知了:

//傳送通知//這裡和KVO的區別,我們可以手動的傳送通知//注意通知的名稱,傳遞的引數必須和定義通知的地方的引數值要一致//將Children物件傳遞過去[[NSNotificationCenter defaultCenter] postNotificationName:@"happyValueNotification" object:self];
我們在屬性值發生變化的地方傳送一個通知:NSNotificationCenter

第一個引數:通知的名稱,這個名稱必須和後面接受通知的名稱一致

第二個引數:可以傳遞的一個引數物件


Nure.h

////  Nure.h//  44_KVO////  Created by jiangwei on 14-10-16.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>@interface Nure : NSObject@end

Nure.m

////  Nure.m//  44_KVO////  Created by jiangwei on 14-10-16.//  Copyright (c) 2014年 jiangwei. All rights reserved.//#import "Nure.h"#import "Children.h"@implementation Nure- (id) init{    self = [super init];    if(self != nil){                //監聽一個通知,當收到通知時,呼叫notificationAction方法        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];            }    return self;}- (void) notificationAction:(NSNotification *)notification{    //這裡我們拿到Children物件進行操作    Children *children = notification.object;    NSLog(@"觸發通知");}- (void)dealloc{    //移除指定的通知,不然會造成記憶體洩露    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];        //Children物件可以新增多個通知    //下面的方法是可以移除Children中所有通知    [[NSNotificationCenter defaultCenter] removeObserver:self];}@end
在Nure類中我們開始接受通知了:

//監聽一個通知,當收到通知時,呼叫notificationAction方法[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"happyValueNotification" object:nil];
使用addObserver方法來監聽通知

第一個引數:監聽者物件

第二個引數:監聽處理邏輯的方法

第三個引數:通知的名稱

第四個引數:通知傳送的時候傳遞過來的引數物件


1、處理通知的方法

- (void) notificationAction:(NSNotification *)notification{    //這裡我們拿到Children物件進行操作    Children *children = notification.object;    NSLog(@"觸發通知");}
這裡會傳遞一個NSNotification物件,通過object屬性可以獲取到監聽物件了,因為我們在傳送通知的時候傳遞過來的這個物件。那麼這裡我們就可以獲取監聽物件的屬性值了,但是這裡我們如果想知道屬性值變化前和變化後的值,我們可以在Children類中在定義一個屬性專門用來記錄舊的屬性值,這樣就可以了。


2、銷燬方法

- (void)dealloc{    //移除指定的通知,不然會造成記憶體洩露    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"happyValueNotification" object:nil];        [[NSNotificationCenter defaultCenter] removeObserver:self];}

在銷燬的方法中,我們可以需要移除監聽者,傳遞過去通知名

但是這裡我們會注意到,還有一個方法:removeObserver方法,是用來移除所有監聽者的,因為可能有多個監聽者。


總結

OC中KVO操作和通知都是很重要的一個操作,他們的原理是基於觀察者模式的,但是KVO操作沒有通知靈活。但是KVO也有自己的優點,比如可以記錄新舊值,這個通知就比較麻煩點了,所以我們在使用的時候視情況而定,一般監聽屬性值變化的我們還是使用KVO.






           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述