ios多線程開發(fā)的常用三種方式

http://www.cnblogs.com/hanjun/p/3667874.html

1.NSThread

2.NSOperationQueue

3.GCD

NSThread:

創(chuàng)建方式主要有兩種:

[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];

NSThread* myThread = [[NSThread alloc] initWithTarget:self

selector:@selector(myThreadMainMethod:)

object:nil];

[myThread start]; //啟動(dòng)線程

這兩種方式的區(qū)別是:前一種一調(diào)用就會(huì)立即創(chuàng)建一個(gè)線程來做事情规伐;而后一種雖然你 alloc 了也 init了方妖,但是要直到我們手動(dòng)調(diào)用 start 啟動(dòng)線程時(shí)才會(huì)真正去創(chuàng)建線程。這種延遲實(shí)現(xiàn)思想在很多跟資源相關(guān)的地方都有用到阅茶。后一種方式我們還可以在啟動(dòng)線程之前,對線程進(jìn)行配置炮障,比如設(shè)置 stack 大小目派,線程優(yōu)先級。

此外還有一種間接的方式:利用NSObject的方法

performSelectorInBackground:withObject: 來創(chuàng)建一個(gè)線程:

[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil]; //在后臺(tái)運(yùn)行某一個(gè)方法

其效果與 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一樣的胁赢。

NSOperationQueue

The NSOperation class is an abstract class you use to encapsulate the code and data associated with a single task. Because it is abstract, you do not use this class directly but instead subclass or use one of the system-defined subclasses (NSInvocationOperation or NSBlockOperation) to perform the actual task.

并發(fā)執(zhí)行你需要重載如下4個(gè)方法

//執(zhí)行任務(wù)主函數(shù)企蹭,線程運(yùn)行的入口函數(shù)

-(void)start

//是否允許并發(fā),返回YES智末,允許并發(fā)谅摄,返回NO不允許。默認(rèn)返回NO

-(BOOL)isConcurrent

- (BOOL)isExecuting

//是否已經(jīng)完成系馆,這個(gè)必須要重載送漠,不然放在放在NSOperationQueue里的NSOpertaion不能正常釋放。

- (BOOL)isFinished

比如TestNSOperation:NSOperaion 重載上述的4個(gè)方法由蘑,

聲明一個(gè)NSOperationQueue,NSOperationQueue *queue = [[[NSOperationQueue alloc ] init]autorelease];

[queue addOperation:testNSoperation];

它會(huì)自動(dòng)調(diào)用TestNSOperation里的start函數(shù)闽寡,如果需要多個(gè)NSOperation,你需要設(shè)置queue的一些屬性,如果多個(gè)NSOperation之間有依賴關(guān)系尼酿,也可以設(shè)置爷狈,具體可以參考API文檔。

(2)非并發(fā)執(zhí)行

-(void)main

只需要重載這個(gè)main方法就可以了裳擎。

dispatch_async(dispatch_queue_t queue,dispatch_block_t block);

async表明異步運(yùn)行,block代表的是你要做的事情,queue則是你把任務(wù)交給誰來處理了.

之所以程序中會(huì)用到多線程是因?yàn)槌绦蛲鶗?huì)需要讀取數(shù)據(jù),然后更新UI.為了良好的用戶體驗(yàn),讀取數(shù)據(jù)的操作會(huì)傾向于在后臺(tái)運(yùn)行,這樣以避免阻塞主線程.GCD里就有三種queue來處理涎永。

GCD

1. Main queue:

顧名思義,運(yùn)行在主線程,由dispatch_get_main_queue獲得.和ui相關(guān)的就要使用MainQueue.

2.Serial quque(private dispatch queue)

每次運(yùn)行一個(gè)任務(wù),可以添加多個(gè),執(zhí)行次序FIFO. 通常是指程序員生成的.

3. Concurrent queue(globaldispatch queue):

可以同時(shí)運(yùn)行多個(gè)任務(wù),每個(gè)任務(wù)的啟動(dòng)時(shí)間是按照加入queue的順序,結(jié)束的順序依賴各自的任務(wù).使用dispatch_get_global_queue獲得.

所以我們可以大致了解使用GCD的框架:

1

2

3

4

5

6

7

dispatch_async(getDataQueue,^{

//獲取數(shù)據(jù),獲得一組后,刷新UI.

dispatch_aysnc(mainQueue, ^{

//UI的更新需在主線程中進(jìn)行

};

}

)

下面 就來總結(jié)一下這三種多線程方式的區(qū)別吧:

Thread 是這三種范式里面相對輕量級的,但也是使用起來最負(fù)責(zé)的,你需要自己管理thread的生命周期羡微,線程之間的同步谷饿。線程共享同一應(yīng)用程序的部分內(nèi)存空間, 它們擁有對數(shù)據(jù)相同的訪問權(quán)限妈倔。你得協(xié)調(diào)多個(gè)線程對同一數(shù)據(jù)的訪問博投,一般做法是在訪問之前加鎖,這會(huì)導(dǎo)致一定的性能開銷启涯。在 iOS 中我們可以使用多種形式的 thread:

Cocoa threads: 使用NSThread 或直接從 NSObject 的類方法 performSelectorInBackground:withObject: 來創(chuàng)建一個(gè)線程贬堵。如果你選擇thread來實(shí)現(xiàn)多線程,那么 NSThread 就是官方推薦優(yōu)先選用的方式结洼。

Cocoa operations是基于 Obective-C實(shí)現(xiàn)的黎做,類 NSOperation 以面向?qū)ο蟮姆绞椒庋b了用戶需要執(zhí)行的操作,我們只要聚焦于我們需要做的事情松忍,而不必太操心線程的管理蒸殿,同步等事情,因?yàn)镹SOperation已經(jīng)為我 們封裝了這些事情鸣峭。 NSOperation 是一個(gè)抽象基類宏所,我們必須使用它的子類。iOS 提供了兩種默認(rèn)實(shí)現(xiàn):NSInvocationOperation 和 NSBlockOperation摊溶。

Grand Central Dispatch (GCD): iOS4 才開始支持爬骤,它提供了一些新的特性,以及運(yùn)行庫來支持多核并行編程莫换,它的關(guān)注點(diǎn)更高:如何在多個(gè) cpu 上提升效率霞玄。

最后,既然說道多線程的開發(fā)拉岁,難免會(huì)在多線程之間進(jìn)行通訊坷剧;

利用NSObject的一些類方法,可以輕松搞定喊暖。

在應(yīng)用程序主線程中做事情:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

在指定線程中做事情:

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

在當(dāng)前線程中做事情:

//Invokes a method of the receiver on the current thread using the default mode after a delay.

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

performSelector:withObject:afterDelay:inModes:

取消發(fā)送給當(dāng)前線程的某個(gè)消息

cancelPreviousPerformRequestsWithTarget:

cancelPreviousPerformRequestsWithTarget:selector:object:

如在我們在某個(gè)線程中下載數(shù)據(jù)惫企,下載完成之后要通知主線程中更新界面等等,可以使用如下接口:- (void)myThreadMainMethod

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// to do something in your thread job

...

[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

[pool release];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陵叽,一起剝皮案震驚了整個(gè)濱河市狞尔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巩掺,老刑警劉巖沪么,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锌半,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門刊殉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殉摔,“玉大人,你說我怎么就攤上這事记焊∫菰拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵遍膜,是天一觀的道長碗硬。 經(jīng)常有香客問我,道長瓢颅,這世上最難降的妖魔是什么恩尾? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挽懦,結(jié)果婚禮上翰意,老公的妹妹穿的比我還像新娘。我一直安慰自己信柿,他們只是感情好冀偶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渔嚷,像睡著了一般进鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上形病,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天客年,我揣著相機(jī)與錄音,去河邊找鬼窒朋。 笑死搀罢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侥猩。 我是一名探鬼主播榔至,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼欺劳!你這毒婦竟也來了唧取?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤划提,失蹤者是張志新(化名)和其女友劉穎枫弟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹏往,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淡诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韩容。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡款违,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出群凶,到底是詐尸還是另有隱情插爹,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布请梢,位于F島的核電站赠尾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毅弧。R本人自食惡果不足惜气嫁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望形真。 院中可真熱鬧杉编,春花似錦、人聲如沸咆霜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾坯。三九已至光酣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脉课,已是汗流浹背救军。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倘零,地道東北人唱遭。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像呈驶,于是被迫代替她去往敵國和親拷泽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容