NSOperation和NSOperationQueue的使用

一、隊(duì)列里可以加入很多個(gè)NSOperation, 可以把NSOperationQueue看作一個(gè)線程池,可往線程池中添加操作(NSOperation)到隊(duì)列中。線程池中的線程可看作消費(fèi)者,從隊(duì)列中取走操作,并執(zhí)行它

二、隊(duì)列類型

1、主隊(duì)列:添加到主隊(duì)列的操作,都會(huì)放到主線程中執(zhí)行

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
           self.imageView.image = image;
       }];

2.非主隊(duì)列

[[[NSOperationQueue alloc] init] addOperationWithBlock:^{
        NSLog(@"下載圖片3---%@", [NSThread currentThread]);
    }];

3.添加隊(duì)列的方式

- (void)addOperation:(NSOperation *)op;

- (void)addOperationWithBlock:(void (^)(void))block

三、基本用法

// 1.創(chuàng)建一個(gè)隊(duì)列(非主隊(duì)列)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 2.添加操作到隊(duì)列中(自動(dòng)異步執(zhí)行任務(wù),并發(fā))
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下載圖片1---%@", [NSThread currentThread]);
    }];
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下載圖片2---%@", [NSThread currentThread]);
    }];
    
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperationWithBlock:^{
        NSLog(@"下載圖片3---%@", [NSThread currentThread]);
    }];
    
    // 3個(gè)操作并發(fā)執(zhí)行

四、常見用法

1.最大并發(fā)數(shù)

 // 1.創(chuàng)建一個(gè)隊(duì)列(非主隊(duì)列)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
 // 2.設(shè)置最大并發(fā)(最多同時(shí)并發(fā)執(zhí)行3個(gè)任務(wù))
    queue.maxConcurrentOperationCount = 3;
    [queue setMaxConcurrentOperationCount:3];

2.取消所有隊(duì)列

[queue cancelAllOperations]; // 取消隊(duì)列中的所有任務(wù)(不可恢復(fù))

3.暫停所有隊(duì)列

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [queue setSuspended:YES]; // 暫停隊(duì)列中的所有任務(wù)
}

4.恢復(fù)所有操縱

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [queue setSuspended:NO]; // 恢復(fù)隊(duì)列中的所有任務(wù)
}

5.依賴

 假設(shè)有A、B、C三個(gè)操作,要求:
 1. 3個(gè)操作都異步執(zhí)行
 2. 操作C依賴于操作B
 3. 操作B依賴于操作A
 在不同queue的NSOperationQueue之間建立依賴關(guān)系 
    // 1.創(chuàng)建一個(gè)隊(duì)列(非主隊(duì)列)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 2.創(chuàng)建3個(gè)操作
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"A1---%@", [NSThread currentThread]);
    }];
    
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"B---%@", [NSThread currentThread]);
    }];
    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"C---%@", [NSThread currentThread]);
    }];
    
    // 設(shè)置依賴
    [operationB addDependency:operationA];
    [operationC addDependency:operationB];
    
    // 3.添加操作到隊(duì)列中(自動(dòng)異步執(zhí)行任務(wù))
    [queue addOperation:operationC];
    [queue addOperation:operationA];
    [queue addOperation:operationB];

6.線程之間的通信

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperationWithBlock:^{
        // 1.異步下載圖片
        NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        
        // 2.回到主線程,顯示圖片
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.imageView.image = image;
        }];
    }];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容