ios多線程

多線程的概括

  • iOS有三種多線程編程的技術余黎,分別是:NSThread,Cocoa NSOperation,GCD這三種編程方式從上到下颖侄,抽象度層次是從低到高的鸟雏,抽象度越高的使用越簡單。

NSThread

  • 需要自己管理線程的生命周期(向?qū)ο笠粯?ARC下不用自己管理览祖,線程同步時線程同步對數(shù)據(jù)的加鎖會有一定的系 統(tǒng)開銷孝鹊。

    //常用兩個方法,一個對象方法需創(chuàng)建NSThread穴墅,一個類方法惶室。
        - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument 
        + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
    
  • 上述方法的使用

    [NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];  
     NSThread* myThread = [[NSThread alloc] initWithTarget:self  
                                        selector:@selector(doSomething:)  
                                       object:nil];  
    [myThread start];
    // NSObject 的方法創(chuàng)建并自動啟動
    [self performSelectorInBackground:@selector(run:) withObject:nil];
  • NSThread的其他方法

    //取消線程
    - (void)cancel;
    //啟動線程
    - (void)start;
    //判斷某個線程的狀態(tài)的屬性
    @property (readonly, getter=isExecuting) BOOL executing;
    @property (readonly, getter=isFinished) BOOL finished;
    @property (readonly, getter=isCancelled) BOOL cancelled;
    //設置和獲取線程名字
    -(void)setName:(NSString *)n;
    -(NSString *)name;
    //獲取當前線程信息
    + (NSThread *)currentThread;
    //獲取主線程信息
    + (NSThread *)mainThread;
    //使當前線程暫停一段時間,或者暫停到某個時刻
    + (void)sleepForTimeInterval:(NSTimeInterval)time;
    + (void)sleepUntilDate:(NSDate *)date;
    
    

2. NSOperation

  • 不需要關心線程管理(創(chuàng)建多少個線程)玄货,數(shù)據(jù)同步(鎖的問題)的事情皇钞,精力放在自己需要執(zhí)行的操作上,然后把操作放在隊列里

2.1NSOperation

創(chuàng)建NSBlockOperation對象

  • 單個操作創(chuàng)建后松捉,單個操作里面再添加block的時候夹界,block會在其他線程上執(zhí)行
     let operation = NSBlockOperation { () -> Void inprint(NSThread.currentThread())
        }
        operation.addExecutionBlock { () -> Void inprint("execution block1 -- \(NSThread.currentThread())")
        }
        operation.start() 
                來源: https://bestswifter.com/multithreadconclusion/
        <NSThread: 0x7f89b1c070f0>{number = 1, name = main} 
        execution block1 -- <NSThread: 0x7f89b1e17030>{number = 2, name = (null)}
>注意;NSBlockOperation 還有一個方法:addExecutionBlock: 隘世,通過這個方法可以給 Operation 添加多個執(zhí)行 Block可柿。這樣 Operation 中的任務 會并發(fā)執(zhí)行,它會 在主線程和其它的多個線程 執(zhí)行這些任務丙者, 

創(chuàng)建NSInvocationOperation對象

  NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

單個操作的需要調(diào)用start開始

隊列

  • 把操作放在隊列中會自動調(diào)用任務的 start() 方法

  • 主隊列

    • 凡是添加到主隊列中的任務(NSOperation)复斥,都會放到主線程中執(zhí)行。
NSOperationQueue *queue = [NSOperationQueue mainQueue];//1.獲取主隊列械媒,串行隊列
                                                         //2.創(chuàng)建NSBlockOperation對象
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@", [NSThread currentThread]);
}];
[queue addOperation:operation];3.隊列添加任務
 
  • 其他隊列(其他隊列的任務會在其他線程并行執(zhí)行目锭。)
//1.創(chuàng)建一個其他隊列   
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 
//2.創(chuàng)建NSBlockOperation對象
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@", [NSThread currentThread]);
}];
 
//3.添加多個Block
for (NSInteger i = 0; i < 5; i++) {
    [operation addExecutionBlock:^{
        NSLog(@"第%ld次:%@", i, [NSThread currentThread]);
    }];
}
 
//4.隊列添加任務
[queue addOperation:operation];
2017-07-28 20:26:28.463 test[18622:4443534] <NSThread: 0x7fd022c3ac10>{number = 5, name = (null)}
 
2017-07-28 20:26:28.463 test[18622:4443536] 第2次 - <NSThread: 0x7fd022e36d50>{number = 2, name = (null)}
 
2017-07-28 20:26:28.463 test[18622:4443535] 第0次 - <NSThread: 0x7fd022f237f0>{number = 4, name = (null)}
 
2017-07-28 20:26:28.463 test[18622:4443533] 第1次 - <NSThread: 0x7fd022d372b0>{number = 3, name = (null)}
 
2017-07-28 20:26:28.463 test[18622:4443534] 第3次 - <NSThread: 0x7fd022c3ac10>{number = 5, name = (null)}
 
2017-07-28 20:26:28.463 test[18622:4443536] 第4次 - <NSThread: 0x7fd022e36d50>{number = 2, name = (null)}
 
  • 另外一種利用隊列的方法,直接添加block纷捞,不需要新建操作痢虹。
- (void)addOperationWithBlock:(void (^)(void))block; //NSOperationQueu來調(diào)用
 

總結:.新建隊列(其他隊列),新建operation,將operation添加到隊列里(自動開線程不用管)不用調(diào)用start方法主儡。系統(tǒng)自動調(diào)用,設置隊列的并發(fā)數(shù)為1就是串行隊列奖唯。串行隊列任務一個接一個執(zhí)行。不設置隊列并發(fā)數(shù)就是并行隊列糜值。并行隊列任務一起執(zhí)行丰捷。

3.GCD

  • Grand Central Dispatch是由蘋果開發(fā)的一個多核編程的解決方案坯墨,自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務瓢阴、銷毀線程)畅蹂。GCD是基于C語言的。
  • GCD的工作原理是:讓程序平行排隊的特定任務荣恐,根據(jù)可用的處理資源,安排他們在任何可用的處理器核心上執(zhí)行任務累贤。
  • 把block添加到隊列里即可叠穆。用異步(或者)同步函數(shù)處理這些。

隊列

  • 主隊列

    //OBJECTIVE-C
      dispatch_queue_t queue = dispatch_get_main_queue();
     
    
    • 主隊列:這是一個特殊的 串行隊列臼膏。什么是主隊列硼被,大家都知道吧无切,它用于刷新 UI弊予,任何需要刷新 UI 的工作都要在主隊列執(zhí)行,所以一般耗時的任務都要放到別的線程執(zhí)行症革。
  • 全局隊列(系統(tǒng)提供的并行隊列)

    //OBJECTIVE-C
      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
     
    
    • 全局隊列異步:操作會新建多個線程始鱼、操作無序執(zhí)行仔掸,隊列前如果有其他任務,會等待前面的任務完成之后再執(zhí)行
    • 全局隊列同步:操作不會新建線程医清、操作順序執(zhí)行
  • 創(chuàng)建隊列

    //OBJECTIVE-C
      //串行隊列
      dispatch_queue_t queue = dispatch_queue_create("tk.bourne.testQueue", NULL);
      dispatch_queue_t queue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_SERIAL);
      //并行隊列
      dispatch_queue_t queue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_CONCURRENT);
     
    

操作

  • 同步操作:

    • 串行隊列同步:操作不會新建線程起暮、操作順序執(zhí)行
    • 并行隊列同步:操作不會新建線程、操作順序執(zhí)行
    dispatch_sync(<#queue#>, ^{
          //code here
          NSLog(@"%@", [NSThread currentThread]);
      });
     
    
  • 異步操作

    • 串行隊列異步:操作需要一個子線程会烙,會新建線程负懦、線程的創(chuàng)建和回收不需要程序員參與,操作順序執(zhí)行柏腻,“最安全的選擇”
    • 并行隊列異步:操作會新建多個線程(有多少任務纸厉,就開n個線程執(zhí)行)、操作無序執(zhí)行五嫂;隊列前如果有其他任務颗品,會等待前面的任務完成之后再執(zhí)行;場景:既不影響主線程贫导,又不需要順序執(zhí)行的操作抛猫!
    dispatch_async(<#queue#>, ^{
          //code here
          NSLog(@"%@", [NSThread currentThread]);
      });
    
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市孩灯,隨后出現(xiàn)的幾起案子闺金,更是在濱河造成了極大的恐慌,老刑警劉巖峰档,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件败匹,死亡現(xiàn)場離奇詭異寨昙,居然都是意外死亡,警方通過查閱死者的電腦和手機掀亩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門舔哪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人槽棍,你說我怎么就攤上這事捉蚤。” “怎么了炼七?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵缆巧,是天一觀的道長。 經(jīng)常有香客問我豌拙,道長陕悬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任按傅,我火速辦了婚禮捉超,結果婚禮上,老公的妹妹穿的比我還像新娘唯绍。我一直安慰自己拼岳,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布推捐。 她就那樣靜靜地躺著裂问,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牛柒。 梳的紋絲不亂的頭發(fā)上堪簿,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音皮壁,去河邊找鬼椭更。 笑死,一個胖子當著我的面吹牛蛾魄,可吹牛的內(nèi)容都是我干的虑瀑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼滴须,長吁一口氣:“原來是場噩夢啊……” “哼舌狗!你這毒婦竟也來了?” 一聲冷哼從身側響起扔水,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤痛侍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后魔市,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體主届,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赵哲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了君丁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枫夺。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绘闷,靈堂內(nèi)的尸體忽然破棺而出橡庞,到底是詐尸還是另有隱情,我是刑警寧澤簸喂,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布毙死,位于F島的核電站,受9級特大地震影響喻鳄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜确封,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一除呵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爪喘,春花似錦颜曾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侦鹏,卻和暖如春诡曙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背略水。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工价卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渊涝。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓慎璧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親跨释。 傳聞我的和親對象是個殘疾皇子胸私,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 一、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關多線程的基本概念鳖谈。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,047評論 6 18
  • 在這篇文章中岁疼,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項蚯姆。當然也會給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 603評論 0 0
  • 1.Pthreads 真正跨平臺的多線程技術五续,可以跨UNIX洒敏、Linux、windows平臺疙驾。 創(chuàng)建Pthread...
    Ljson閱讀 3,116評論 3 29
  • 一凶伙、前言 本篇博文介紹的是iOS中常用的幾個多線程技術: NSThread GCD NSOperation 由于a...
    和玨貓閱讀 575評論 0 1
  • 關于歷史扳肛,有太多的見解和說法傻挂,自古民間都有說書人在各大茶館,街道上繪聲繪色的一遍又一遍地講述歷史上的事情和人物挖息,但...
    憶先生閱讀 273評論 4 3