GCD和NSOperation學習筆記

GCD學習筆記

1.dispatch_sync—同步操作

eg: dispatch_queue_t concurrentQueue =dispatch_queue_create("my.concurrent.queue”,DISPATCH_QUEUE_CONCURRENT);

NSLog(@"1");

dispatch_sync(concurrentQueue, ^(){

NSLog(@"2");

[NSThread sleepForTimeInterval:10];

NSLog(@"3");

});

NSLog(@"4”);

輸出信息:12(10s后)34

sync包裹的代碼塊阻塞住當前線程執(zhí)行代碼,包裹的代碼塊本身依然是順序執(zhí)行的

dispatch_async—異步操作

eg:dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);

NSLog(@"1");

dispatch_async(concurrentQueue, ^(){

NSLog(@"2");

[NSThread sleepForTimeInterval:5];

NSLog(@"3");

});

NSLog(@"4”);

輸出 1 4 2 (5s后)3

async不會阻塞當前線程的代碼執(zhí)行,包裹的代碼塊的本身依然是順序執(zhí)行的

注意:不能理解為同步是在主線程隊列去執(zhí)行的驶睦,而異步是開一個新的線程隊列去執(zhí)行代碼!淹朋!同步方法調(diào)用就是在占用當前線程(可以是主線程也可以是子線程)資源去執(zhí)行代碼偏塞,執(zhí)行完同步方法才可以執(zhí)行后面代碼;異步方法就是在當前線程(可以是主線程也可以是子線程)基礎上開辟新的執(zhí)行分支邦鲫,讓異步方法之后的代碼不被異步方法代碼阻塞掉灸叼。

2.GCD處理費時操作的方式

常見問題分析思路:主觀感覺就是與UI處理相關(guān)的操作,比如說點擊滑動如果出現(xiàn)卡頓庆捺,可能是主線程執(zhí)行耗時操作導致古今。

dispatch_async(dispatch_get_global_queue(0, 0), ^{

//處理耗時操作的代碼塊...

//通知主線程刷新

dispatch_async(dispatch_get_main_queue(), ^{

//回調(diào)或者說是通知主線程刷新,

});

});

3.隊列的概念滔以,GCD除了線程同步異步還有隊列的概念

同步異步是線程概念捉腥,串行并行是隊列概念。

使用GCD的時候你画,我們會把需要處理的任務放到Block里面抵碟,然后講任務追加到相應的隊列里面,這個隊列坏匪,叫Dispatch Queue拟逮。然而,存在于兩種Dispatch Queue适滓,一種等待上一個任務執(zhí)行完畢再執(zhí)行下一個任務的是串行隊列(如果上面任務沒有執(zhí)行完畢敦迄,下面的任務就不能執(zhí)行,造成死鎖的現(xiàn)象)凭迹,一種是不需要等待上一個任務執(zhí)行完畢罚屋,就能執(zhí)行下一個的并行隊列。GCD為我們提供兩個隊列嗅绸,dispatch_get_global_queue—全局并行隊列

dispatch_get_main_queue—串行隊列脾猛,當然,可以自己定義串行并行隊列

dispatch_queue_t concurrentQueue =dispatch_queue_create("my.concurrent.queue”,DISPATCH_QUEUE_SERIAL);—串行隊列

dispatch_queue_t concurrentQueue =dispatch_queue_create("my.concurrent.queue”,DISPATCH_QUEUE_CONCURRENT);—并行隊列

這兩種隊列和全局并行對列以及主線程串行隊列的區(qū)別在哪呢朽砰。舉例說明尖滚。

1.定義同步異步兩種方法,循環(huán)打印3次當前線程



2.創(chuàng)建四種隊列瞧柔,在主線程中分別調(diào)用同步異步方法漆弄,查看打印結(jié)果。


此時的結(jié)論是(此時):

1.主線程中調(diào)用同步方法造锅,不開辟新線程撼唾。如果調(diào)用同步主線程,則會形成死鎖(第一種情況)哥蔚。

2.主線程中調(diào)用異步方法倒谷,除調(diào)用異步主線程外蛛蒙,都開辟新線程。

加工一下同步異步方法渤愁,讓該同步異步方法在非主線程隊列中執(zhí)行牵祟。



結(jié)果是

此時結(jié)論是(此時):

1.子線程中調(diào)用同步方法,不開辟新線程抖格。如果調(diào)用同步當前線程隊列诺苹,則會形成死鎖(第一種情況)。

2.子線程中調(diào)用異步方法雹拄,除調(diào)用異步當前隊列外收奔,都開辟新線程。

最終結(jié)論是:

1.在當前線程下(主線程或子線程)滓玖,sync同步當前線程所在隊列坪哄,如果是該隊列是串行隊列,一定會死鎖势篡,如果是并行隊列翩肌,則不開辟新線程;async異步當前線程所在隊列禁悠,如果是該隊列是串行隊列摧阅,不開辟新線程,如果是并行隊列绷蹲,則開辟新線程棒卷。

2.可以理解為全局并行隊列是自定義并行隊列的實例,主線程隊列是自定義串行隊列的實例祝钢,之所以在例1中展示不同是因為當前運行程序的線程就是主線程隊列而已比规。

3.串行和并行的區(qū)別在于開辟新線程時,如果是多個任務拦英,那么并行開辟多個線程蜒什,串行只開辟一個線程。

那么疤估,看幾個死鎖的分析灾常。

https://mp.weixin.qq.com/s?__biz=MzA3NzM0NzkxMQ==&mid=216361271&idx=1&sn=50525882289b8841956c79cdb63d30f8&scene=0&key=e57780a9dd53e6fc909f1650042874bba95d3134de321ab8e9761b87db930eadeb15d4440d96a767ce710b2f898798b66d1f9d125f898ffc80b9e7bdc128472fdff783513f01adb3d8a4dd902f2c77bb&ascene=0&uin=NTA4MDg1MjU=&devicetype=iMac+MacBookPro12,1+OSX+OSX+10.12.5+build(16F73)&version=12020710&nettype=WIFI&fontScale=100&pass_ticket=+dHDHWeJCQmC9vm3hv/Rf1qqR77mwMuAMxkXQqJK6mE=


NSOperation學習筆記

NSOperation是基于GCD的延伸。

NSOperation做GCD的事情:

主線程隊列 NSOperationQueue * queue = [NSOperationQueue mainQueue]

自定義并行隊列 NSOperationQueue * queue = [[NSOperationQueue alloc]init];

自定義串行隊列 NSOperationQueue * queue = [[NSOperationQueue alloc]init];queue.maxConcurrentOperationCount=1;

默認添加到隊列的操作都會開辟新線程铃拇。

創(chuàng)建NSOperation的方法可以繼承NSOperation類钞瀑,重新main方法,也可以使用NSBlockOperation慷荔,NSInvocationOperation雕什。

NSOperation做GCD以外的事情:

1.給NSOperation添加依賴,讓任務可以按照自己想要的優(yōu)先級順序執(zhí)行。

2.設置NSOperationQueue最大并發(fā)數(shù)贷岸。

3.控制NSOperation的狀態(tài)(暫停壹士,恢復,取消)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偿警,一起剝皮案震驚了整個濱河市躏救,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螟蒸,老刑警劉巖落剪,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尿庐,居然都是意外死亡,警方通過查閱死者的電腦和手機呢堰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門抄瑟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人枉疼,你說我怎么就攤上這事皮假。” “怎么了骂维?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵惹资,是天一觀的道長。 經(jīng)常有香客問我航闺,道長褪测,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任潦刃,我火速辦了婚禮侮措,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乖杠。我一直安慰自己分扎,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布胧洒。 她就那樣靜靜地躺著畏吓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卫漫。 梳的紋絲不亂的頭發(fā)上菲饼,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音列赎,去河邊找鬼巴粪。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肛根。 我是一名探鬼主播辫塌,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼派哲!你這毒婦竟也來了臼氨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤芭届,失蹤者是張志新(化名)和其女友劉穎储矩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褂乍,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡持隧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逃片。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屡拨。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褥实,靈堂內(nèi)的尸體忽然破棺而出呀狼,到底是詐尸還是另有隱情,我是刑警寧澤损离,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布哥艇,位于F島的核電站,受9級特大地震影響僻澎,放射性物質(zhì)發(fā)生泄漏貌踏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一窟勃、第九天 我趴在偏房一處隱蔽的房頂上張望哩俭。 院中可真熱鬧,春花似錦拳恋、人聲如沸凡资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隙赁。三九已至,卻和暖如春梆暖,著一層夾襖步出監(jiān)牢的瞬間伞访,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工轰驳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厚掷,地道東北人弟灼。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像冒黑,于是被迫代替她去往敵國和親田绑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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