iOS多線程(NSThread線程/并發(fā)NSOperation/GCD)

1.iOS的三種多線程技術

1.NSThread每個NSThread對象對應一個線程梅屉,量級較輕(真正的多線程)

2.以下兩點是蘋果專門開發(fā)的“并發(fā)”技術皆愉,使得程序員可以不再去關心線程的具體使用問題蝉绷,更多利用POSIX

(1)NSOperation/NSOperationQueue面向對象的線程技術

(2)GCD —— Grand Central Dispatch(中央派發(fā)) 是基于C語言的框架(可能是pthread)徽职,可以充分利用多核叫倍,是蘋果推薦使用的多線程技術

以上這三種編程方式從上到下偷卧,抽象度層次是從低到高的,抽象度越高的使用越簡單吆倦,也是Apple最推薦使用的听诸,在項目中很多框架技術分別使用了不同多線程技術。

2.三種多線程技術的對比

?NSThread:

–優(yōu)點:NSThread 比其他兩個輕量級蚕泽,使用簡單

–缺點:需要自己管理線程的生命周期晌梨、線程同步、加鎖须妻、睡眠以及喚醒等仔蝌。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷

?NSOperation:

–不需要關心線程管理,數(shù)據(jù)同步的事情荒吏,可以把精力放在自己需要執(zhí)行的操作上

–NSOperation是面向對象的

?GCD:

–Grand Central Dispatch是由蘋果開發(fā)的一個多核編程的解決方案敛惊。iOS4.0+才能使用,是替代NSThread绰更, NSOperation的高效和強大的技術

–GCD是基于C語言的

3.三種多線程技術的實現(xiàn)

3.1. NSThread的多線程技術瞧挤,

1> 類方法直接開啟后臺線程锡宋,并執(zhí)行選擇器方法

detachNewThreadSelector

//?新建一個線程,調用@selector方法2 ?[NSThread?detachNewThreadSelector:@selector(bigDemo)?toTarget:self?withObject:nil];

2> 成員方法特恬,在實例化線程對象之后员辩,需要使用start執(zhí)行選擇器方法

initWithTarget

//?成員方法

NSThread?*thread?=?[[NSThread?alloc]?initWithTarget:self?selector:@selector(bigDemo)?object:nil];

//?啟動start線程

[thread?start];

對于NSThread的簡單使用,可以用NSObject的performSelectorInBackground替代

//?performSelectorInBackground是將bigDemo的任務放在后臺線程中執(zhí)行 [self?performSelectorInBackground:@selector(bigDemo)?withObject:nil];

同時鸵鸥,在NSThread調用的方法中,同樣要使用autoreleasepool進行內(nèi)存管理丹皱,否則容易出現(xiàn)內(nèi)存泄露妒穴。

//?自動釋放池?

//?負責其他線程上的內(nèi)存管理,在使用NSThread或者NSObject的線程方法時摊崭,一定要使用自動釋放池?

//?否則容易出現(xiàn)內(nèi)存泄露讼油。?

@autoreleasepool?{  }

3.2 NSOperation,面向對象的多線程技術

1> 使用步驟:

1) 實例化操作

//?實例化操作隊列

?_queue?=?[[NSOperationQueue?alloc]?init];

a) NSInvocationOperation

NSInvocationOperation?*op1?=?[[NSInvocationOperation?alloc]?initWithTarget:self?selector:@selector(opAction)?object:nil];

//?如果使用start呢簸,會在當前線程啟動操作

//????

[op1?start];

//?1.?一旦將操作添加到操作隊列矮台,操作就會啟動

[_queue?addOperation:op1];

b) NSBlockOperation

#pragma?mark?模仿下載網(wǎng)絡圖像?

-?(IBAction)operationDemo:(id)sender ?{?

//?1.?下載

NSBlockOperation?*op1?=?[NSBlockOperation?blockOperationWithBlock:^{?

NSLog(@"下載?%@"?,?[NSThread?currentThread]);?

}];

//?2.?濾鏡

NSBlockOperation?*op2?=?[NSBlockOperation?blockOperationWithBlock:^{

NSLog(@"濾鏡?%@"?,?[NSThread?currentThread]);

}];

//?3.?顯示

NSBlockOperation?*op3?=?[NSBlockOperation?blockOperationWithBlock:^{

?????????NSLog(@"更新UI?%@"?,?[NSThread?currentThread]);

?????}];

//?添加操作之間的依賴關系,所謂“依賴”關系根时,就是等待前一個任務完成后瘦赫,后一個任務才能啟動

//?依賴關系可以跨線程隊列實現(xiàn)

//?提示:在指定依賴關系時,注意不要循環(huán)依賴蛤迎,否則不工作确虱。

[op2?addDependency:op1];

[op3?addDependency:op2];

[op1?addDependency:op3];

[_queue?addOperation:op1];

[_queue?addOperation:op2];

[[NSOperationQueue?mainQueue]?addOperation:op3];

}

2) 將操作添加到隊列NSOperationQueue即可啟動多線程執(zhí)行

?[_queue?addOperation:op1];

?[_queue?addOperation:op2];

2> 更新UI使用主線程隊列

//兩方式

[NSOpeationQueue?mainQueue]?addOperation?^{

};

[[NSOperationQueue?mainQueue]?addOperation:op3];

3> 操作隊列的setMaxConcurrentOperationCount

可以設置同時并發(fā)的線程數(shù)量!

//?控制同時最大并發(fā)的線程數(shù)量

[_queue?setMaxConcurrentOperationCount:2];

提示:此功能僅有NSOperation有替裆!

4> 使用addDependency可以設置任務的執(zhí)行先后順序校辩,同時可以跨操作隊列指定依賴關系

//?添加操作之間的依賴關系,所謂“依賴”關系辆童,就是等待前一個任務完成后宜咒,后一個任務才能啟動

//?依賴關系可以跨線程隊列實現(xiàn)

//?提示:在指定依賴關系時,注意不要循環(huán)依賴把鉴,否則不工作故黑。

[op2?addDependency:op1];

[op3?addDependency:op2];

[op1?addDependency:op3];

提示:在指定依賴關系時,注意不要循環(huán)依賴纸镊,否則不工作倍阐。

3.3. GCD,C語言

GCD就是為了在“多核”上使用多線程技術

1> 要使用GCD逗威,所有的方法都是dispatch開頭的

2> 名詞解釋

global全局

queue隊列

async異步

sync同步

3> 要執(zhí)行異步的任務峰搪,就在全局隊列中執(zhí)行即可

dispatch_async 異步執(zhí)行控制不住先后順序

4> 關于GCD的隊列

全局隊列dispatch_get_global_queue

參數(shù):優(yōu)先級 DISPATCH_QUEUE_PRIORITY_DEFAULT

始終是 0

dispatch_queue_t?queue?=?dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,?0);

可同步 可異步

串行隊列

dispatch_queue_t?queue?=?dispatch_queue_create("myQueue",?DISPATCH_QUEUE_SERIAL);

是創(chuàng)建得到的,不能直接獲取

只能同步

主隊列dispatch_get_main_queue

dispatch_async(dispatch_get_main_queue(),?^{

? ? ? ? ?NSLog(@"main?-?>?%@",?[NSThread?currentThread]);

});

只能同歩

5> 異步和同步與方法名無關凯旭,與運行所在的隊列有關概耻!

同步主要用來控制方法的被調用的順序

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末使套,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鞠柄,更是在濱河造成了極大的恐慌侦高,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌杜,死亡現(xiàn)場離奇詭異奉呛,居然都是意外死亡,警方通過查閱死者的電腦和手機夯尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門瞧壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匙握,你說我怎么就攤上這事咆槽。” “怎么了圈纺?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵秦忿,是天一觀的道長。 經(jīng)常有香客問我蛾娶,道長灯谣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任茫叭,我火速辦了婚禮酬屉,結果婚禮上,老公的妹妹穿的比我還像新娘揍愁。我一直安慰自己呐萨,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布莽囤。 她就那樣靜靜地躺著谬擦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朽缎。 梳的紋絲不亂的頭發(fā)上惨远,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音话肖,去河邊找鬼北秽。 笑死,一個胖子當著我的面吹牛最筒,可吹牛的內(nèi)容都是我干的贺氓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼床蜘,長吁一口氣:“原來是場噩夢啊……” “哼辙培!你這毒婦竟也來了蔑水?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扬蕊,失蹤者是張志新(化名)和其女友劉穎搀别,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尾抑,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡歇父,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了再愈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庶骄。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖践磅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灸异,我是刑警寧澤府适,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肺樟,受9級特大地震影響檐春,放射性物質發(fā)生泄漏。R本人自食惡果不足惜么伯,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一疟暖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧田柔,春花似錦俐巴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缀磕,卻和暖如春缘圈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袜蚕。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工糟把, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牲剃。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓遣疯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颠黎。 傳聞我的和親對象是個殘疾皇子另锋,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 801評論 0 3
  • .一.進程 進程:是指在系統(tǒng)中正在運行的一個應用程序,每個進程之間是獨立的滞项,每個進程均運行在其專用且受保護的內(nèi)存空...
    IIronMan閱讀 4,490評論 1 33
  • 歡迎大家指出文章中需要改正或者需要補充的地方,我會及時更新夭坪,非常感謝文判。 一. 多線程基礎 1. 進程 進程是指在系...
    xx_cc閱讀 7,191評論 11 70
  • 單例模式例子: https://github.com/XiaoRuiZuo/Singleton 多線程:多線程是為...
    Lee堅武閱讀 1,403評論 0 50
  • 又到了虐心的情人節(jié) 我在超市幫你選購你喜歡吃的熏腸 你在你家里睡懶覺 說起床了拖完地再過來陪我 于是 我自己吃晚飯...
    妮妮小阿貍閱讀 324評論 0 8