NSOperation

相比GCD NSOperation更加的靈活

1.NSInvocationOperation

創(chuàng)建操作 ---> 創(chuàng)建隊列 ---> 操作加入隊列

    // 處理事務
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(handleInvocation:) object:@"hello"];

    //如果沒有創(chuàng)建隊列直接啟動事務就在主線程里
    //[op start];

    // 創(chuàng)建隊列
    NSOperationQueue *queue   = [[NSOperationQueue alloc] init];
    // 操作加入隊列
    [queue addOperation:op];
    
    //在這里不可以啟動摘昌,因為已經(jīng)啟動,此時在去啟動就會把一個在running狀態(tài)的隊列重新start 造成線程混亂直接GG  
    //可以用 [[NSOperationQueue mainQueue] addOperation:op];
    //[op start];

2.NSBlockOperation

相比NSInvocationOperation子巾,NSBlockOperation是函數(shù)式編程,代碼可讀性更強

    //1:創(chuàng)建blockOperation
    NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
        sleep(3);
    }];
    
    //1.1 添加執(zhí)行代碼塊
    [bo addExecutionBlock:^{
        NSLog(@"這是一個執(zhí)行代碼塊 - %@",[NSThread currentThread]);
    }];
    //1.2 設置監(jiān)聽
    bo.completionBlock = ^{
        NSLog(@"完成了!!!");
    };
    
    //2:創(chuàng)建隊列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //3:添加到隊列
    [queue addOperation:bo];
    NSLog(@"事務添加進了NSOperationQueue");

3.優(yōu)先級

- (void)demo{
    // 優(yōu)先級
    NSBlockOperation *bo1 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"**第一個操作** %d --- %@", i, [NSThread currentThread]);
        }
    }];
    // 設置優(yōu)先級 - 最高
    bo1.qualityOfService = NSQualityOfServiceUserInteractive;
    
    //創(chuàng)建第二個操作
    NSBlockOperation *bo2 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第二個操作 %d --- %@", i, [NSThread currentThread]);
        }
    }];
    // 設置優(yōu)先級 - 最低
    bo2.qualityOfService = NSQualityOfServiceBackground;
    
    //2:創(chuàng)建隊列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //3:添加到隊列
    [queue addOperation:bo1];
    [queue addOperation:bo2];
    
}

4.線程通訊

- (void)demo {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.name = @"hello";
    [queue addOperationWithBlock:^{
        NSLog(@"%@ = %@",[NSOperationQueue currentQueue],[NSThread currentThread]);
        //模擬請求網(wǎng)絡
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"%@ --%@",[NSOperationQueue currentQueue],[NSThread currentThread]);
        }];
    }];
}

5.控制并發(fā)量

- (void)demo {
    // 設置并發(fā)數(shù)
    self.queue.name = @"hello";
    self.queue.maxConcurrentOperationCount = 2;
    for (int i = 0; i<10; i++) {
        [self.queue addOperationWithBlock:^{ // 一個任務
            [NSThread sleepForTimeInterval:2];
            NSLog(@"%d-%@",i,[NSThread currentThread]);
        }];
    }
}

6.依賴關系

- (void)demo{
    NSBlockOperation *bo1 = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:0.5];
        NSLog(@"請求token");
    }];
    
    NSBlockOperation *bo2 = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:0.5];
        NSLog(@"拿著token,請求數(shù)據(jù)1");
    }];
    
    NSBlockOperation *bo3 = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:0.5];
        NSLog(@"拿著數(shù)據(jù)1,請求數(shù)據(jù)2");
    }];
    
    // 建立依賴最容易犯的問題就是循環(huán)嵌套
    [bo2 addDependency:bo1];
    [bo3 addDependency:bo2];
    
    //[bo1 addDependency:bo3];

    [self.queue addOperations:@[bo1,bo2,bo3] waitUntilFinished:YES];
    
    NSLog(@"執(zhí)行完了?我要干其他事");
}

7.掛起、繼續(xù)迈螟、取消

正在執(zhí)行的操作無法掛起或者取消
執(zhí)行結果發(fā)現(xiàn),正在執(zhí)行的操作無法取消,因為這要回想到之前的NSThread
只有在內(nèi)部判斷才能取消完畢

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叉抡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子答毫,更是在濱河造成了極大的恐慌褥民,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洗搂,死亡現(xiàn)場離奇詭異消返,居然都是意外死亡,警方通過查閱死者的電腦和手機耘拇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門撵颊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惫叛,你說我怎么就攤上這事倡勇。” “怎么了挣棕?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵译隘,是天一觀的道長。 經(jīng)常有香客問我洛心,道長固耘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任词身,我火速辦了婚禮厅目,結果婚禮上,老公的妹妹穿的比我還像新娘法严。我一直安慰自己损敷,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布深啤。 她就那樣靜靜地躺著拗馒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溯街。 梳的紋絲不亂的頭發(fā)上诱桂,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音呈昔,去河邊找鬼挥等。 笑死,一個胖子當著我的面吹牛堤尾,可吹牛的內(nèi)容都是我干的肝劲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辞槐!你這毒婦竟也來了掷漱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤催蝗,失蹤者是張志新(化名)和其女友劉穎切威,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丙号,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年缰冤,在試婚紗的時候發(fā)現(xiàn)自己被綠了犬缨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡棉浸,死狀恐怖怀薛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迷郑,我是刑警寧澤枝恋,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嗡害,受9級特大地震影響焚碌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霸妹,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一十电、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叹螟,春花似錦鹃骂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至良价,卻和暖如春寝殴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棚壁。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工杯矩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袖外。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓史隆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親曼验。 傳聞我的和親對象是個殘疾皇子泌射,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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