成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iPhone應用開發之NSRunLoop概述

移動開發 iOS
其實NSRunLoop的本質是一個消息機制的處理模式。如果你對vc++編程有一定了解,在windows中,有一系列很重要的函數SendMessage,PostMessage,GetMessage,這些都是有關消息傳遞處理的API。

iPhone應用開發中關于NSRunLoop的概述是本文要介紹的內容,NSRunLoop是一種更加高明的消息處理模式,他就高明在對消息處理過程進行了更好的抽象和封裝,這樣才能是的你不用處理一些很瑣碎很低層次的具體消息的處理,在NSRunLoop中每一個消息就被打包在input source或者是timer source中了,來看詳細內容。

1.什么是NSRunLoop

我們會經常看到這樣的代碼:

  1.  - (IBAction)start:(id)sender  
  2. {  
  3. pageStillLoading = YES;  
  4. [NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil];  
  5. [progress setHidden:NO];  
  6. while (pageStillLoading) {  
  7. [NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];  
  8. }  
  9. [progress setHidden:YES];  
  10. }  

這段代碼很神奇的,因為他會“暫停”代碼運行,而且程序運行不會因為這里有一個while循環而受到影響。在[progress setHidden:NO]執行之后,整個函數想暫停了一樣停在循環里面,等loadPageInBackground里面的操作都完成了以后才讓[progress setHidden:YES]運行。這樣做就顯得簡介,而且邏輯很清晰。如果你不這樣做,你就需要在loadPageInBackground里面表示load完成的地方調用[progress setHidden:YES],顯得代碼不緊湊而且容易出錯。

那么具體什么是NSRunLoop呢?其實NSRunLoop的本質是一個消息機制的處理模式。如果你對vc++編程有一定了解,在windows中,有一系列很重要的函數SendMessage,PostMessage,GetMessage,這些都是有關消息傳遞處理的API。

但是在你進入到Cocoa的編程世界里面,我不知道你是不是走的太快太匆忙而忽視了這個很重要的問題,Cocoa里面就沒有提及到任何關于消息處理的API,開發者從來也沒有自己去關心過消息的傳遞過程,好像一切都是那么自然,像大自然一樣自然?在Cocoa里面你再也不用去自己定義WM_COMMAD_XXX這樣的宏來標識某個消息,也不用在switch-case里面去對特定的消息做特別的處理。難道是Cocoa里面就沒有了消息機制?答案是否定的,只是Apple在設計消息處理的時候采用了一個更加高明的模式,那就是RunLoop。

2. NSRunLoop工作原理

接下來看一下NSRunLoop具體的工作原理,首先是官方文檔提供的說法,看圖:

iPhone應用開發之NSRunLoop概述

通過所有的“消息”都被添加到了NSRunLoop中去,而在這里這些消息并分為“input source”和“Timer source” 并在循環中檢查是不是有事件需要發生,如果需要那么就調用相應的函數處理。為了更清晰的解釋,我們來對比VC++和iOS消息處理過程。

VC++中在一切初始化都完成之后程序就開始這樣一個循環了(代碼是從戶sir mfc程序設計課程的slides中截取):

  1. int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR  lpCmdLine,int nCmdShow){  
  2. ...  
  3. while (GetMessage(&msg, NULL, 0, 0)){  
  4. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){  
  5. TranslateMessage(&msg);  
  6. DispatchMessage(&msg);  
  7. }  
  8. }  
  9. }  

可以看到在GetMessage之后就去分發處理消息了,而iOS中main函數中只是調用了UIApplicationMain,那么我們可以介意猜出UIApplicationMain在初始化完成之后就會進入這樣一個情形:

  1. int UIApplicationMain(...){  
  2. ...  
  3. while(running){  
  4. [NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];  
  5. }  
  6. ...  
  7. }  

所以在UIApplicationMain中也是同樣在不斷處理runloop才是的程序沒有退出。剛才的我說了NSRunLoop是一種更加高明的消息處理模式,他就高明在對消息處理過程進行了更好的抽象和封裝,這樣才能是的你不用處理一些很瑣碎很低層次的具體消息的處理,在NSRunLoop中每一個消息就被打包在input source或者是timer source中了,當需要處理的時候就直接調用其中包含的相應對象的處理函數了。

所以對外部的開發人員來講,你感受到的就是,把source/timer加入到runloop中,然后在適當的時候類似于[receiver action]這樣的事情發生了。甚至很多時候,你都沒有感受到整個過程前半部分,你只是感覺到了你的某個對象的某個函數調用了。

比如在UIView被觸摸時會用touchesBegan/touchesMoved等等函數被調用,也許你會想,“該死的,我都不知道在那里被告知有觸摸消息,這些處理函數就被調用了!?”所以,消息是有的,只是runloop已經幫你做了!為了證明我的觀點,我截取了一張debug touchesBegan的call stack,有圖有真相,如圖:

iPhone應用開發之NSRunLoop概述

現在會過頭來看看剛才的那個會“暫停”代碼的例子,有沒有更加深入的認識了呢?

小結:iPhone應用開發之NSRunLoop概述的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-10 10:10:21

iPhoneUIPopoverCo

2011-08-11 17:15:54

iPhone歸檔

2011-08-09 11:36:41

iPhoneUIPickerVieDEMO

2011-08-17 15:19:38

iPhone應用數據

2011-07-29 10:41:27

IPhone 應用開發 照相機

2011-08-03 16:01:24

iPhone應用開發 自動登陸

2011-08-08 10:10:14

iPhone開發 圖片 方法

2011-08-08 16:56:44

iPhone 字符處理 視圖

2011-08-09 17:29:29

iPhone文件屏幕

2011-08-01 18:27:58

iPhone開發 UISearchBa

2011-07-08 14:58:16

iPhone Xcode iOS

2011-07-19 09:46:38

2011-07-19 09:58:36

2014-07-30 09:56:41

iPhoneiPad

2011-08-05 14:48:06

iPhone應用 異步隊列

2011-08-09 13:10:32

iPhone地圖開發

2011-08-10 17:37:00

iPhoneASIHTTPRequ

2011-08-18 10:39:46

iPhone開發界面

2011-08-08 13:57:19

iPhone開發 打包 DEB

2011-08-08 14:57:46

iPhone Autoreleas Property
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品亚洲精品国产欧美 | 欧美精品tv | 日日操夜夜操视频 | 国产精久久久久久久 | 国产成人a亚洲精品 | 做a视频 | 欧美二区三区 | 黄色福利| 色综合成人网 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 三级成人在线观看 | 成人一区二区三区视频 | 久久久九九 | 日韩中文字幕av | www.天天操.com | 国产大学生情侣呻吟视频 | 黄色一级大片视频 | 免费在线成人 | www.日本三级 | 北条麻妃国产九九九精品小说 | 国产亚洲一区二区三区在线 | 成人在线小视频 | 亚州精品天堂中文字幕 | 精品国产一区二区三区四区在线 | 亚洲国产精品第一区二区 | 中文在线观看视频 | 九九久久精品视频 | 久久草视频 | 全部免费毛片在线播放网站 | 日本污视频 | 久久综合一区 | av大片在线观看 | 精品中文字幕一区 | 天天综合干 | 嫩草国产 | 麻豆久久久9性大片 | 在线免费中文字幕 | 伊人伊成久久人综合网站 | 男女羞羞视频大全 | 91 在线| 国产久 |