iOS多線程編程之NSOperation和NSOperationQueue的使用

(一)隊列裏可以加入很多個NSOperation, 可以把NSOperationQueue看作一個線程池,可往線程池中添加操作(NSOperation)到隊列中。線程池中的線程可看作消費者,從隊列中取走操作,並執行它。

(二)隊列類型

      1、主隊列:添加到主隊列的操作,都會放到主線程中執行。

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

       2、非主隊列:添加到非主隊列的操作,都會放到子線程中執行。

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

(三)隊列添加任務的方式

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

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

(四)基本用法

// 1.創建一個隊列(非主隊列)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 2.添加操作到隊列中(自動異步執行任務,併發)
    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個操作併發執行

(四)常見用法


        1、最大併發數

 // 1.創建一個隊列(非主隊列)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 2.設置最大併發(最多同時併發執行3個任務)
    queue.maxConcurrentOperationCount = 3;
    [queue setMaxConcurrentOperationCount:3];

        2、取消所有操作

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

        3、暫停所有操作

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

        4、恢復所有操作

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

     5、依賴:可以在不同queue的NSOperationQueue之間建立依賴關係

    /**
     假設有A、B、C三個操作,要求:
     1. 3個操作都異步執行
     2. 操作C依賴於操作B
     3. 操作B依賴於操作A
     */
    
    // 1.創建一個隊列(非主隊列)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 2.創建3個操作
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"A1---%@", [NSThread currentThread]);
    }];
    
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"B---%@", [NSThread currentThread]);
    }];
    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"C---%@", [NSThread currentThread]);
    }];
    
    // 設置依賴
    [operationB addDependency:operationA];
    [operationC addDependency:operationB];
    
    // 3.添加操作到隊列中(自動異步執行任務)
    [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;
        }];
    }];


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章