1.基本概念
進(jìn)程:操作系統(tǒng)上每一個(gè)可以執(zhí)行的程序舷手。
線程:進(jìn)程中的任務(wù),必須在線程中執(zhí)行寺旺。
每一個(gè)進(jìn)程,至少包含一個(gè)線程雨效,就是我們常說的主線程迅涮。
2.任務(wù)在線程中的執(zhí)行
任務(wù)在線程中一次一個(gè)的依次執(zhí)行。一個(gè)線程同時(shí)只能執(zhí)行一個(gè)任務(wù)徽龟。
如果我們需要同時(shí)執(zhí)行多個(gè)任務(wù)叮姑,就需要多個(gè)線程,每次執(zhí)行一個(gè)任務(wù)据悔。
為了提高用戶體驗(yàn)传透,我們就需要使用多線程,比如:網(wǎng)絡(luò)請(qǐng)求极颓,下載圖片朱盐。
3.線程操作的三種方式NSThread、GCD菠隆、NSOperation
(1)NSThread兵琳,輕量級(jí)的線程操作狂秘,需要我們自己創(chuàng)建線程,調(diào)度任務(wù)躯肌,銷毀線程
① 后臺(tái)線程:performSelectorInBackground
② 主線程;performSelectorOnMainThread
③ 以上兩個(gè)線程,只要繼承自NSObject的對(duì)象,都可以調(diào)用
④ 手動(dòng)開辟一個(gè)分線程:
NSThread * thread = [[NSThread alloc] initWithTarget:(id) selector:(SEL) object:(id)];
[thread start];
⑤ 自動(dòng)開辟分線程:[NSThread detachNewThreadSelector:(SEL) toTarget:(id) withObject:(id)]
⑥ 判斷線程是否為主線程:[NSThread isMainThread]
⑦ 線程休眠:[NSThread sleepForTimeInterval:2]
⑧ 查看當(dāng)前線程:[NSThread currentThread]
(2)GCD為Grand Central Dispatch的縮寫 宏大的的中央調(diào)度 基于C語言
<1>GCD存在于libdispatch.dylib這個(gè)庫中者春,這個(gè)調(diào)度庫包含了GCD的所有的東西,但任何IOS程序清女,默認(rèn)就加載了這個(gè)庫钱烟,在程序運(yùn)行的過程中會(huì)動(dòng)態(tài)的加載這個(gè)庫,不需要我們手動(dòng)導(dǎo)入嫡丙。
<2>GCD中的函數(shù)大多數(shù)都以dispatch開頭拴袭。
GCD的優(yōu)勢(shì):
1.他是蘋果公司為多核的并行運(yùn)算提出的解決方案,它會(huì)自動(dòng)利用更多的處理器核心;
- GCD會(huì)負(fù)責(zé)創(chuàng)建線程調(diào)度你的任務(wù);你只需創(chuàng)建任務(wù), 并添加到適當(dāng)?shù)年?duì)列中( 無需關(guān)心何時(shí)開起曙博、關(guān)閉線程)
dispatch queue (調(diào)度隊(duì)列)
核心理念: 將長(zhǎng)期運(yùn)行的任務(wù)拆分成多個(gè)工作單元, 并把它們添加調(diào)度隊(duì)列拥刻。(即將任務(wù)添加到隊(duì)列當(dāng)中)
串行和并行隊(duì)列
串行隊(duì)列,添加到隊(duì)列中的任務(wù)按添加順序依次執(zhí)行父泳。FIFO泰佳,先進(jìn)先出。
并行隊(duì)列尘吗,多個(gè)任務(wù)同時(shí)執(zhí)行,需要多條分線程浇坐。
同步與異步
同步:依次執(zhí)行任務(wù)(上個(gè)任務(wù)執(zhí)行完畢睬捶,下個(gè)任務(wù)才能執(zhí)行)。
異步:不管前一個(gè)任務(wù)是否執(zhí)行完畢,后一個(gè)任務(wù)都直接執(zhí)行
總結(jié):
同步(串行/并行):(依次執(zhí)行)只有一個(gè)主線程近刘,沒有子線程擒贸。
異步:(并發(fā)執(zhí)行)
串行:1個(gè)子線程
并行:多個(gè)子線程
任務(wù):
線程:
1.同步異步:是否創(chuàng)建子線程。同步不創(chuàng)建觉渴,異步創(chuàng)建介劫。?案淋?座韵??
2.串行并行:決定在線程中一次執(zhí)行一個(gè)任務(wù)還是并發(fā)執(zhí)行多個(gè)任務(wù).踢京?誉碴??瓣距?
3.并行隊(duì)列只有在異步函數(shù)下才有效
GCD 使用隊(duì)列(queue)管理線程黔帕,隊(duì)列分為三種
1.自定義的串行和并行隊(duì)列。
2.運(yùn)行在分線程的4個(gè)優(yōu)先級(jí)不同全局并行隊(duì)列蹈丸,globalQueue成黄。
3.運(yùn)行在主線程的串行隊(duì)列呐芥,mianQueue。(在主線程中,主隊(duì)列中使用同步任務(wù)會(huì)造成死鎖)
在一組并行任務(wù)執(zhí)行完畢后做某個(gè)操作,使用dispatch_group
鎖
多個(gè)線程對(duì)同一個(gè)變量的修改需要加鎖奋岁。保證一個(gè)變量同時(shí)只能被一個(gè)線程修改思瘟,當(dāng)這個(gè)線程修改完畢后,其他線程才能修改厦取〕碧可以使用:NSLock,@synchronized虾攻。
單例模式:是一個(gè)類在系統(tǒng)中只有一個(gè)實(shí)例對(duì)象,通過全局的一個(gè)入口點(diǎn)對(duì)這個(gè)實(shí)例對(duì)象進(jìn)行訪問.
iOS中單例模式的實(shí)現(xiàn)方法有兩種:非ARC和ARC + GCD;
(3)NSOperation 純OC代碼 操作隊(duì)列,對(duì)GCD的封裝.它是一個(gè)抽象類铡买,只能使用其子類對(duì)象。系統(tǒng)提供了兩個(gè)子類對(duì)象霎箍,分別是 NSInvocationOperation 和 NSBlockOperation奇钞。通常我們自定義 NSOperation 的子類,重寫子類的 main 方法漂坏,把需要在分線程執(zhí)行的任務(wù)放在 main 方法里景埃。然后把 NSOperation 對(duì)象添加到 NSOperationQueue 中,就會(huì)自動(dòng)在分線程執(zhí)行 main 方法顶别。
4.GCD 和 NSOperation 進(jìn)行比較谷徙。
(1).NSOperation 是對(duì) GCD 的封裝,面相對(duì)象的類驯绎,GCD只是一組方法API完慧。
(2).NSOperation 可以實(shí)現(xiàn)一些 GCD 中無法實(shí)現(xiàn)或者比較復(fù)雜的功能。比如:設(shè)置最大并發(fā)數(shù)剩失,設(shè)置線程間的依賴關(guān)系屈尼。
(3).實(shí)現(xiàn)某個(gè)多線程功能,使用 GCD拴孤,簡(jiǎn)單易用脾歧。實(shí)現(xiàn)某個(gè)多線程模塊,使用 NSOperation演熟,方便類的管理鞭执。
5.nonatomic,atomic
nonatomic芒粹,非原子性蚕冬,多線程訪問修改不加鎖。
atomic是辕,原子性囤热,多線程訪問加鎖。
iOS 推薦我們使用 nonatomic获三,移動(dòng)端的開發(fā)沒有復(fù)雜的多線程場(chǎng)景旁蔼,不加鎖解鎖可以提高效率锨苏。
系統(tǒng)的可變對(duì)象,NSMutableArray棺聊,NSMutabelString 都是線程不安全的伞租,多線程修改,需要加鎖限佩。