2010年3月25日 星期四

iPhone 開發技巧(4) 通知追蹤

我們平常對於iPhone App的開發,都是著重在MVC或商業邏輯上,當然大家一定會有自己的一套除錯方式,或是利用Performance Tool等來進行調效,不過這裡Sam想和大家說一下通知追蹤。

iPhone應用程式中的互動可分為三大類:Delegate(委派)、Target-Action(目標-動作)及Notification(通知)。

Delegate(委派)的作用方式可將它想像成使用者告知A去做事,而A事先把這份責任委派給B,因此,A在接收到做事指令後會直接轉交B來執行(聽起來有點類似推卸責任...雖然最後還是會把事情做完...)。

Target-Action(目標-動作)的作用方式有點類似觸發的概念,大多用在UIControl的子類別中,例如UIBarButtonItem在新建時可以設定target與action, 表示當使用者按下這個UIBarButtonItem,會觸發一個程序將action的訊息發送給target物件,等於是UIBarButtonItem和target物件在互相連絡。action為使用selector指定的方法,例如@selector(setObject:);

Notification(通知)可以讓應用程式裡的物件相互溝通,近似於Java及ActionScript的Event/Listener。iPhone裡共有四種通知中心,包含NSNotificationCenter、NSDistributedNotificationCenter、DarwinNotificationCenter與TelephonyNotificationCenter,Sam這幾天只研究NSNotificationCenter/NSNotification這兩個類別,所以其他三個不多做介紹。

一個應用程式只會有一個NSNotificationCenter通知中心,我們可以向通知中心進行訂閱並監聽,其中傳輸的物件為NSNotification,如果有興趣查一下API的話可以瞭解到它的兩個參數name與object可以分別存放通知名稱與資料。所以這些特點可以讓我們利用來曉得iPhone App底層運作的情形。

// 追蹤監聽
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(trackNotifications:) name:nil object:nil];

// 顯示監聽結果
-(void) trackNotifications:(NSNotification *)notification
{
    printf("NOTIFICATION: %s\n", [[notification name] UTF8String]);
}

通常Sam會把它加在UIViewController中,追蹤程式碼放在loadView內,監聽結果則放在類別中。上面兩段程式碼的處理過程為取得NSNotificationCenter(只有一個所以是defaultCenter,它是Singleton的),然後訂閱到UIViewController自己,並且用trackNotifications來監聽(selector指定),於是一執行程式就會看到整個應用程式的產生流程。










這個方式可以用在將來自己寫通知的時候,也可以用在找bug到底停在哪一個環節上,更可以幫助你了解底層運作的情形,大家不妨玩看看~

1 則留言:

  1. 補充一下大家可以看一下這份講義 http://fruitstandsoftware.com/files/NSNotification_and_NSNotificationCenter.pdf

    回覆刪除