OC學習日記012(一)通知——觀察者模式的另一種形式

這裏寫圖片描述

注意:

我們隨着學習的深入,在對KVC和KVO以及通知的學習中,我們發現原來簡單的命令行的程序已經不能直觀的反映我們學習的問題了,而且爲了對後面UI的學習,我們可以新建IOS工程裏面的Single View Application 項目,以便我們之後的學習。
這裏寫圖片描述

我們進去以後運行工程,系統會爲我們生成你選擇的一個iphone的模擬器。

以下是一些常用快捷鍵:

Cmd+1/2/3/4/5 可以切換模擬器的顯示比例。
command+Shift+H 模擬器的Home鍵。
command+Shift+H(兩次) 模擬器的Home鍵連按效果,管理運行的程序。
Cmd+向左箭頭/向右箭頭 切換橫豎屏。
Option+Shift 可以在模擬器中調出雙指拖動效果。
Option 可以在模擬器中調出雙指放大縮小效果。
command+Q 關閉模擬器

這裏寫圖片描述
這個模擬器會記錄我們之前建立的一些項目,比如你裝了Coco2dx,然後建立了一個hellworld模版,它也會顯示在裏面.
當然,暫時我們不會用到這個模擬器很多,包括前端控件的使用會在後面的IOS開發基礎中涉及。
這裏寫圖片描述

我們現在只會暫時用到ViewController.m文件,這個是ios運行時反饋到後臺控制以及後臺的一些數據輸出的界面,運行的結果不會顯示在模擬器裏面,我們可以把這個文件當作我們之前的main.m文件。

通知 NSNotificaiton

通過學習KVO,我們發現KVO是一種簡單的觀察者設計模式,涉及到兩個步驟,分別是觀察者和被觀察者。這種方式實質有很大的侷限性,那麼OC的‘Foundation’模型又分爲開發者提供了新的一種觀察者設計模式,即通知。
通知,是一種發送給一個或多個觀察者,用來通知其在程序中發生了某個事件的消息。Cocoa中的通知機制遵循的是一種廣播的模式。它是一種程序中事件的發起者或者是處理者和其他想要知道該事件的對象溝通的一種方式。消息的接受者,也就是觀察者響應該事件來改變自己的UI、行爲或者狀態。

在OC中,使用NSNotification類來表示一個通知

初始化一個通知NSNotification的實例對象

 NSNotification *notification1=[NSNotification notificationWithName:@"通知名稱1" object:self];
   NSNotification *notification2=[NSNotification notificationWithName:@"通知名稱"object:self userInfo:@{@"content:":@"hello: world"}];

以下爲這個方法兩個值應該輸入的東西^-^:

NSNotification *notification6=[NSNotification notificationWithName:... object:...];

Name:通知名稱
object:通知發起人


通知中心

(單例類,拿到通知中心的單例)

    NSNotificationCenter *center=[NSNotificationCenter defaultCenter];

建立通知的發送機制,如下:

 1.註冊相關的監聽者,並實現在需要的時候回調方法
 2.在需要的時候,被監聽者的對象去到通知中心發送消息
 3.移除監聽者

在Student類文件中,我們建立一個通知的發送機制:

註冊監聽者

    /*
     1.要去接受通知的對象
     2.接受通知要回調的相應方法
     3.接受通知的名字
     4.發起通知的對象,一般我們不需要知道,把它寫成nil
     */
@implementation Student
-(id)init{
    if (self=[super init]) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction:) name:@"通知名稱2" object:nil];
    }
    return self;
}

回調方法

-(void)notificationAction:(NSNotification *)notification{
    NSLog(@"%@",notification.userInfo);
}

移除監聽者

-(void)dealloc{
    //移除某個通知的監聽者
//[[NSNotificationCenter defaultCenter]removeObserver:self name:@"通知名稱2" object:nil];
    //移除所有通知的監聽者
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}

在ViewController.m文件中:

    Student *student=[[Student alloc]init];
    [center postNotification:notification2];

下面兩種可以不用重新建立通知,直接使用

  [center postNotificationName:@"通知名稱3" object:self];
    [center postNotificationName:@"通知名稱4" object:self userInfo:@{@"ss":@"ww"}];
Weather *weather =[[Weather alloc]init];
PhoneUser *phoneUser =[[PhoneUser alloc]init];

[weather sendMessage];

_weather=weather;
_phoneUser=phoneUser;

}
在- (void)viewDidLoad 外,我們可以建立touch的方法
-(void)touchesBegan:(NSSet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章