多線程、GCD

新開多線程:
(普通)

// GCD 是基于隊列的 多線程實現(xiàn)方式  
// 隊列的類型  
// 1.并行: 多個任務同時執(zhí)行 Concurrent  
// 2.串行: 依次執(zhí)行任務(同一事件只執(zhí)行一個任務) Serial  
   
// 自己創(chuàng)建一個隊列  
// 參數(shù)1:給隊列起個名字  
// 參數(shù)2:選擇隊列的類型 DISPATCH_QUEUE_CONCURRENT(串行)   
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);  
// 使用隊列    
// 參數(shù)1: 在哪個隊列執(zhí)行代碼    
// 參數(shù)2: 要執(zhí)行的代碼    
dispatch_async(queue, ^{  
    [self downLoadImage];  //回調(diào)  
}); 

(高級用法)

  // 系統(tǒng)定義了5個隊列  
    // 1. 一個串行隊列  主隊列作用 : 管理主線程的相關(guān)事務  
       
    // 獲得主隊列  
    dispatch_queue_t mainQueue = dispatch_get_main_queue();  
    // 在主隊列執(zhí)行任務  
//    dispatch_async(mainQueue, ^{  
//        [self btnUpClicked:nil];  
//    });  
       
       
    // 2. 4個并行隊列 (并行隊列)  
    // 參數(shù)1: 選擇隊列的優(yōu)先級  
    // 參數(shù)2: 給未來使用 一般填0  
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
//    dispatch_async(globalQueue, ^{  
//        [self btnUpClicked:nil];  
//    });  
       
    // 高端使用  
    // 1.全局隊列獲取數(shù)據(jù) 回到主隊列將數(shù)據(jù)加載到視圖上  
//    dispatch_async(globalQueue, ^{  
//         
//        // 全局隊列(子線程)獲取數(shù)據(jù)  
//        NSString *str = @"htt://www.baidu.com";  
//        NSURL *url = [NSURL URLWithString:str];  
//          
//        NSData *data = [NSData dataWithContentsOfURL:url];  
//        UIImage *image = [UIImage imageWithData:data];  
//          
//        // 返回主線程 加載UI/更新UI  
//        dispatch_async(mainQueue, ^{  
//             
//            UIImageView *imageView = [[UIImageView alloc] init];  
//            // 給視圖賦值  
//            imageView.image = image;  
//              
//        });  
//    });  
       
    // 2.一段代碼只執(zhí)行依次  
    // 大部分的時候 都在單例方法中使用  
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        NSLog(@"只執(zhí)行依次");  
    });  
       
    // 3.一段代碼執(zhí)行多次 (全局隊列有效)  
    // 參數(shù)1: 執(zhí)行多少次  
    // 參數(shù)2: 在哪個隊列有效  
    // 參數(shù)3: 要執(zhí)行的內(nèi)容  
    dispatch_apply(4, globalQueue, ^(size_t a) {  
        NSLog(@"%zu", a);  
    });  
       
    // 4.定時  
    // 參數(shù)1: 間隔幾秒  
    // 參數(shù)2: 執(zhí)行的內(nèi)容  
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(44 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  
        NSLog(@"=====");  
    });  

學習

#pragma mark -- 開辟線程
    //一盐数、NSObject 隱式開辟線程
    //開辟后臺線程 執(zhí)行某方法
//    [self performSelectorInBackground:@selector(loadingImageWithUrlString:) withObject:IMAGE_URL];
    //會到主線程中做某事
//    [self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>]
    
    //二催享、 NSThread 線程類 對pthread的一種封裝
//    [NSThread detachNewThreadSelector:@selector(loadingImageWithUrlString:) toTarget:self withObject:IMAGE_URL];
    
    //對象方法 需要手動管理
//    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(loadingImageWithUrlString:) object:IMAGE_URL];
//    [thread start];/**< 手動開啟 */
    
    //三、NSOperation 抽象類  需要用子類初始化诬乞,需要加入到線程對壘中進行管理
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];//創(chuàng)建多線程隊列
    //NSInvocationOperation 是NSOperation的子類
    NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadingImageWithUrlString:) object:IMAGE_URL];
    [invocationOperation setCompletionBlock:^{
        //更新UI
    }];
    //加入隊列
    [queue addOperation:invocationOperation];
    //NSBlockOperation
    NSBlockOperation *blockOpertion = [NSBlockOperation blockOperationWithBlock:^{
        //做線程里面的事俊抵,耗時操作
        [self loadingImageWithUrlString:IMAGE_URL];
    }];
    [blockOpertion setCompletionBlock:^{
        //更新UI
    }];
    [queue addOperation:blockOpertion];
    
    //簡寫 NSBlockOperation
    [queue addOperationWithBlock:^{
        //做線程里面的事慢叨,耗時操作
    }];
 #pragma mark -- GCD
    //四、GCD(中央調(diào)度)優(yōu)勢:自動選取CPU內(nèi)核务蝠,線程自己管理
    //并發(fā):多個任務同時執(zhí)行(在異步下才有效果)
    //串行:任務一個一個執(zhí)行
    //同步:在當前線程中執(zhí)行拍谐,不具有開辟線程的功能
    //異步:開辟一個線程去執(zhí)行任務,具有開辟線程的能力
    
    //任務(bolck) - 隊列(queue)
    //dispatch_get_main_queue() 特殊的串行隊列馏段,起任務只在主線程中執(zhí)行
    dispatch_async(dispatch_get_main_queue(), ^{
        //任務
    });
    //串行隊列
//    dispatch_queue_t myQueue = dispatch_queue_create("name",DISPATCH_QUEUE_SERIAL);
    
    //并發(fā)隊列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(globalQueue, ^{
        //執(zhí)行任務
        //耗時操作
        dispatch_async(dispatch_get_main_queue(), ^{
            //更新UI
        });
    });
    
#pragma mark -- 隊列組
    
    //隊列組轩拨,同時執(zhí)行多個耗時操作
    //創(chuàng)建隊列組
    dispatch_group_t groupQueue = dispatch_group_create();
    dispatch_group_async(groupQueue, globalQueue, ^{
        //耗時操作一
        
    });
    dispatch_group_async(groupQueue, globalQueue, ^{
        //耗時操作二
        
    });
    dispatch_group_async(groupQueue, dispatch_get_main_queue(), ^{
        //更新UI
    });
   }
- (void)loadingImageWithUrlString:(NSString *)string{
//從網(wǎng)上獲取圖片
    NSURL *url = [NSURL URLWithString:string];
    NSData *data = [NSData dataWithContentsOfURL:url];
    //刷新界面  放入主線程中執(zhí)行
    dispatch_async(dispatch_get_main_queue(), ^{
        
        self.contentImageView.image = [UIImage imageWithData:data];
    });
        self.loadImageView.hidden = YES;
}
#pragma mark -- 線程安全
- (void)openThread{
 //創(chuàng)建兩個線程同時進行一個操作
    NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(countChanged) object:nil];
    thread1.name = @"thread1";
    [thread1 start];
    
    NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(countChanged) object:nil];
    thread2.name = @"thread2";
    [thread2 start];
    
}
- (void)countChanged{
    static int count = 20;
//    //創(chuàng)建一個死循環(huán)
//    while (1) {
//        //添加線程鎖
//        [self.lock lock];
//
//        NSLog(@"%@ - %d",[NSThread currentThread],count);
//        count --;
//        if (count < 0) {
//            break;
//        }
//        //解鎖
//        [self.lock unlock];
//    }
    
    @synchronized(self) {
        //具有線程安全的
        while (1) {
            NSLog(@"%@ - %d",[NSThread currentThread],count);
            count --;
            if (count < 0) {
                break;
        }
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(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
  • 正文 為了忘掉前任卑雁,我火速辦了婚禮募书,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘序厉。我一直安慰自己,他們只是感情好毕箍,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布弛房。 她就那樣靜靜地躺著,像睡著了一般而柑。 火紅的嫁衣襯著肌膚如雪文捶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天媒咳,我揣著相機與錄音粹排,去河邊找鬼。 笑死涩澡,一個胖子當著我的面吹牛顽耳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荣茫,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诈泼,長吁一口氣:“原來是場噩夢啊……” “哼费变!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胰耗,我...
    開封第一講書人閱讀 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)容

  • 目錄 一、基本概念1.多線程2.串行和并行骆莹, 并發(fā)3.隊列與任務4.同步與異步5.線程狀態(tài)6.多線程方案 二颗搂、GC...
    BohrIsLay閱讀 1,574評論 5 12
  • GCD是蘋果推出的一套從底層線程編程中抽象出的一種基于隊列來管理任務的方式。相對于直接在線程上執(zhí)行任務幕垦,使用GCD...
    流水_事閱讀 493評論 0 0
  • 多線程學習筆記-GCD 我把這篇文章所用到的代碼總結(jié)到這里->GCD項目總結(jié)下載地址-GCD-wxk可以下載參考 ...
    wxkkkkk閱讀 532評論 0 2
  • 多線程是程序開發(fā)中非扯猓基礎(chǔ)的一個概念,大家在開發(fā)過程中應該或多或少用過相關(guān)的東西先改。同時這恰恰又是一個比較棘手的概念...
    小笨狼閱讀 6,978評論 12 70
  • 解讀 一.女生自殺現(xiàn)象的分析 比較鬧騰的女孩是不會自殺疚察,她其實很害怕,她們的內(nèi)心是極度缺乏安全感仇奶。而會自殺呢那種是...
    大劉leo閱讀 343評論 0 0