NSTimer、 NSTask、 NSThread 和 NSRunloop 之間的差別:
- NSTimer是一個計時器對象,方法調用在對未來的選擇對象。
- NSThread是一個線程類。 也就是建立一個線程。
- NSTask類是一個過程,一種方式運作程式從您的其他程式。
- NSOperation是一個非常漂亮的抽象的任務。 在這個類中嵌入您的操作,你可以很容易地通過一個NSOperationQueue執行類的手段同時進行。
- NSRunLoop其實NSRunLoop的本質是一個消息機制的處理模式。在某種意義上摘要和适應的選擇()的Unix系統調用,管理和排程輸入源事件和線程計時器。
每個程式運作在至少一個線程 。 你能想到的每一個單獨的程序中的程式執行的線程,每個其他平行進行。
如果你有一些港口樣的使用者界面,或其他代碼,需要聽取網絡事件,你需要一個運作循環 。 每個NSThread自動都有自己的運作循環,你很少有直接關心他們自己。 在運作循環也創造和釋放autorelease池負責。
[檢視更多關于autorelease池的讨論意見。 最重要的一點要記住的是,新的線程必須考慮設立一個autorelease池照顧。 例如,與detachNewThreadSelector調用的方法應該為他們的第一個和最後一個行如下:
NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ];
[code here]
[pool release];
這同樣适用于其他線程使用的技術産生。]
在主線程 ,所有的UI處理正在發生,運作循環是非常重要的,因為它保持了界面反應。 這就是為什麼你應該永遠不會運作的代碼,就在主線程耗時:它會吃掉所有的線程和循環的運作時間将不會被允許運作往往不夠,導緻鎖定或緩慢接口。 如果您需要執行耗時計算,或保持一個任務在背景運作,你應該建立一個新線程。 同樣,你可能不必考慮新的運作循環正在形成。 在一個新線程執行的方法簡單的方法:
[NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil];
線程間的通信可能會非常棘手,你應該知道performSelector的方法:onThread:withObject:waitUntilDone:和performSelectorOnMainThread:withObject:waitUntilDone:
定時器也處理運作循環。 相反運作循環,你可能經常會使用你的程式定時器直接。 建立一個最簡單的方法是非常計時器:
[self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0];
但有時你需要建立和管理NSTimer對象自己,例如能夠取消和重新使用一個計時器。
一個NSTask用于運作一個又一個計劃,目前一子的。 這有點類似于一個獨立的線程開始,但是如果子崩潰,您的主要程式将繼續運作。 程式之間的通信也很不同從多個線程之間的通信在同一程序中。
你用“iPhone”你的問題,并在iPhone你将永遠不會使用NSTasks。
NSOperations是用來當您需要處理不同的任務量較大,他們把隊列和/或處理他們在單獨的線程(雖然他們沒有單獨的線程中運作)。 如果您的應用程式需要建立隻是少數人,專門線程,則沒有理由使用NSOperation類。 但是,如果你會經常産生想與伺服器通信任務()必須保持記錄,NSOperation和NSOperationQueue能派上用場。
NSRunLoop:首先是Run Loop的部分概念,它的作用就是循環、處理事件。具體來說有兩個方面: 1. 定時啟動任務(一般用和Timer協作);2. 處理事件。
在 單線程的app中,不需要注意Run Loop,但不代表沒有。程式啟動時,系統已經在主線程中加入了Run Loop。它保證了我們的主線程在運作起來後,就處于一種“等待”的狀态(而不像一些指令行程式一樣運作一次就結束了),這個時候如果有接收到的事件 (Timer的定時到了或是其他線程的消息),就會執行任務,否則就處于休眠狀态。
如果我們要寫多線程的程式,可能就需要自己來管理Run Loop。
下面說一下樓主提出的方法中的參數:
RunMode: NSDefaultRunLoopMode,可以把這個了解為一個”過濾器“,我們可以隻對自己關心的事件進行監視。一般NSDefaultRunLoopMode是最常用的。
啟動run loop的方法就是lz寫的這個,它的說明如下:
Runs the loop once, blocking for input in the specified mode until a given date.
啟動run loop一次,在特定的run loop mode下等待輸入。
如果沒有附加input source或是timer,或是過limitDate,run loop就會退出,并且方法傳回NO。
下來是Run Loop的使用場合:
1. 使用port或是自定義的input source來和其他線程進行通信
2. 線上程(非主線程)中使用timer
3. 使用 performSelector...系列(如performSelectorOnThread, ...)
4. 使用線程執行周期性工作
run loop不需要建立,線上程中隻需要調用[NSRunLoop currentRunLoop]就可以得到
假設我們想要等待某個異步方法的回調。比如connection。如果我們的線程中沒有啟動run loop,是不會有效果的(因為線程已經運作完畢,正常退出了)。