1. 程式人生 > >ios多執行緒--NSOperation

ios多執行緒--NSOperation

NSOperation的基本使用:
NSOperation是對GCD的封裝,兩個核心概念:佇列,操作
它的基本概念:
NSOperation本身是抽象類,只能只有它的子類
三個子類分別是:NSBlockOperation、NSInvocationOperation以及自定義繼承自NSOperation的類
NSOperation和NSOperationQueue結合使用實現多執行緒併發
相關的程式碼操作:

//  01 NSInvocationOperation
    //1.封裝操作
    /*
     第一個引數:目標物件
     第二個引數:該操作要呼叫的方法,最多接受一個引數
     第三個引數:呼叫方法傳遞的引數,如果方法不接受引數,那麼該值傳nil
     */
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil]; //2.啟動操作 [operation start]; ------------------------------------------------- // 02 NSBlockOperation //1.封裝操作 /* NSBlockOperation提供了一個類方法,在該類方法中封裝操作 */
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //在主執行緒中執行 NSLog(@"---download1--%@",[NSThread currentThread]); }]; //2.追加操作,追加的操作在子執行緒中執行 [operation addExecutionBlock:^{ NSLog(@"---download2--%@",[NSThread currentThread]); }]; [operation addExecutionBlock:^{ NSLog
(@"---download3--%@",[NSThread currentThread]); }]; //3.啟動執行操作 [operation start]; ---------------------------------------------- // 03 自定義NSOperation //如何封裝操作? //自定義的NSOperation,通過重寫內部的main方法實現封裝操作 -(void)main { NSLog(@"--main--%@",[NSThread currentThread]); } //如何使用? //1.例項化一個自定義操作物件 ZXOperation *op = [[ZXOperation alloc]init]; //2.執行操作 [op start];

NSOperationQueue基本使用:
主佇列: 通過mainQueue獲得,凡是放到主佇列中的任務都將在主執行緒執行
非主佇列: 直接alloc init出來的佇列。非主佇列同時具備了併發和序列的功能,通過設定最大併發數屬性來控制任務是併發執行還是序列執行

//自定義NSOperation
-(void)customOperation
{
    //1.建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //2.封裝操作
    //好處:1.資訊隱蔽
    //2.程式碼複用

    ZXOperation *op1 = [[ZXOperation alloc]init];
    ZXOperation *op2 = [[ZXOperation alloc]init];

    //3.新增操作到佇列中
    [queue addOperation:op1];
    [queue addOperation:op2];
}

//NSBlockOperation
- (void)block
{
    //1.建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //2.封裝操作
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1----%@",[NSThread currentThread]);
    }];

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"2----%@",[NSThread currentThread]);

    }];

    [op2 addExecutionBlock:^{
        NSLog(@"3----%@",[NSThread currentThread]);
    }];

    [op2 addExecutionBlock:^{
        NSLog(@"4----%@",[NSThread currentThread]);
    }];

    //3.新增操作到佇列中
    [queue addOperation:op1];
    [queue addOperation:op2];

    //補充:簡便方法
    [queue addOperationWithBlock:^{
        NSLog(@"5----%@",[NSThread currentThread]);
    }];

}

//NSInvocationOperation
- (void)invocation
{
    /*
     GCD中的佇列:
     序列佇列:自己建立的,主佇列
     併發佇列:自己建立的,全域性併發佇列

     NSOperationQueue
     主佇列:[NSOperationQueue mainqueue];凡事放在主佇列中的操作都在主執行緒中執行
     非主佇列:[[NSOperationQueue alloc]init],併發和序列,預設是併發執行的
     */

    //1.建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //2.封裝操作
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download1) object:nil];

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


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


    //3.把封裝好的操作新增到佇列中
    [queue addOperation:op1];//[op1 start]
    [queue addOperation:op2];
    [queue addOperation:op3];
}

NSOperation其它用法

1.設定最大併發數【控制任務併發和序列】

//1.建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //2.設定最大併發數
    //注意點:該屬性需要在任務新增到佇列中之前進行設定
    //該屬性控制佇列是序列執行還是併發執行
    //如果最大併發數等於1,那麼該佇列是序列的,如果大於1那麼是並行的
    //系統的最大併發數有個預設的值,為-1,如果該屬性設定為0,那麼不會執行任何任務
    queue.maxConcurrentOperationCount = 2;

2.暫停和恢復以及取消

//設定暫停和恢復
    //suspended設定為YES表示暫停,suspended設定為NO表示恢復
    //暫停表示不繼續執行佇列中的下一個任務,暫停操作是可以恢復的
    if (self.queue.isSuspended) {
        self.queue.suspended = NO;
    }else
    {
        self.queue.suspended = YES;
    }

    //取消佇列裡面的所有操作
    //取消之後,當前正在執行的操作的下一個操作將不再執行,而且永遠都不在執行,就像後面的所有任務都從佇列裡面移除了一樣
    //取消操作是不可以恢復的
    [self.queue cancelAllOperations];

---------自定義NSOperation取消操作--------------------------
-(void)main
{
    //耗時操作1
    for (int i = 0; i<1000; i++) {
        NSLog(@"任務1-%d--%@",i,[NSThread currentThread]);
    }
    NSLog(@"+++++++++++++++++++++++++++++++++");

    //蘋果官方建議,每當執行完一次耗時操作之後,就檢視一下當前佇列是否為取消狀態,如果是,那麼就直接退出
    //好處是可以提高程式的效能
    if (self.isCancelled) {
        return;
    }

    //耗時操作2
    for (int i = 0; i<1000; i++) {
        NSLog(@"任務1-%d--%@",i,[NSThread currentThread]);
    }

    NSLog(@"+++++++++++++++++++++++++++++++++");
}

NSOperation實現執行緒間通訊
1.開子執行緒下載圖片

 //1.建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //2.使用簡便方法封裝操作並新增到佇列中
    [queue addOperationWithBlock:^{

        //3.在該block中下載圖片
        NSURL *url = [NSURL URLWithString:@"http://news.51sheyuan.com/uploads/allimg/111001/133442IB-2.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        NSLog(@"下載圖片操作--%@",[NSThread currentThread]);

        //4.回到主執行緒重新整理UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            self.imageView.image = image;
            NSLog(@"重新整理UI操作---%@",[NSThread currentThread]);
        }];
    }];

2.下載多張圖片合成綜合案例(設定操作依賴)

//02 綜合案例
- (void)download2
{
    NSLog(@"----");
    //1.建立佇列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //2.封裝操作下載圖片1
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

        NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];

        //拿到圖片資料
        self.image1 = [UIImage imageWithData:data];
    }];


    //3.封裝操作下載圖片2
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSURL *url = [NSURL URLWithString:@"http://pic.58pic.com/58pic/13/87/82/27Q58PICYje_1024.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];

        //拿到圖片資料
        self.image2 = [UIImage imageWithData:data];
    }];

    //4.合成圖片
    NSBlockOperation *combine = [NSBlockOperation blockOperationWithBlock:^{

        //4.1 開啟圖形上下文
        UIGraphicsBeginImageContext(CGSizeMake(200, 200));

        //4.2 畫image1
        [self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];

        //4.3 畫image2
        [self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];

        //4.4 根據圖形上下文拿到圖片資料
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//        NSLog(@"%@",image);

        //4.5 關閉圖形上下文
        UIGraphicsEndImageContext();

        //7.回到主執行緒重新整理UI
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            self.imageView.image = image;
            NSLog(@"重新整理UI---%@",[NSThread currentThread]);
        }];

    }];

    //5.設定操作依賴
    [combine addDependency:op1];
    [combine addDependency:op2];

    //6.新增操作到佇列中執行
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:combine];
    }

相關推薦

iOS 執行 NSOperation、NSOperationQueue

1. NSOperation、NSOperationQueue 簡介 NSOperation、NSOperationQueue 是蘋果提供給我們的一套多執行緒解決方案。實際上 NSOperation、NSOperationQueue 是基於 GCD 更高一層的封裝,完全面向物件。但是比 G

ios執行--NSOperation

NSOperation的基本使用: NSOperation是對GCD的封裝,兩個核心概念:佇列,操作 它的基本概念: NSOperation本身是抽象類,只能只有它的子類 三個子類分別是:NSBlockOperation、NSInvocationOper

ios 執行 -- NSOperation 常用方法

1 最大併發數 最大併發數:同一時間最多隻能執行的任務的個數。 最⼤大併發數的相關⽅方法 - (NSInteger)maxConcurrentOperationCount; - (void)setMaxConcurrentOperationCount:

IOS執行NSoperation和GCD的比較

GCD是基於c的底層api,NSOperation屬於object-c類。iOS首先引入的是NSOperation,IOS4之後引入了GCD和NSOperationQueue並且其內部是用gcd實現的。 相對於GCD: 1,NSOperation擁有更多的函式可用,具體檢視api。

iOS開發-iOS執行開發中踩過的坑-GCD的特性-NSOperation執行依賴-iOS執行踩坑小結

本期內容: iOS開發中從其他執行緒回到主執行緒的方法 dispatch_group_create 組的概念 dispatch_sync同步排程主執行緒會死鎖的原因 專案中什麼時候選擇GCD什麼時候選擇NSOperation NSOperation 執行緒依賴

iOS執行(NSThread、NSOperation、GCD)程式設計

全域性併發佇列的獲取方法(需要傳入兩個引數。第一個引數表示佇列優先順序,一般用DISPATCH_QUEUE_PRIORITY_DEFAULT。第二個引數暫時沒用,用0即可)dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PR

iOS 執行簡單整理NSThread、GCD、NSOperation

iOS Pthreads 和 NSThread Pthreads:可以在Unix / Linux / Windows 等系統跨平臺使用,使用 C 語言編寫,需要程式設計師自己管理執行緒的生命週期,使用難度較大 NSThread:是蘋果官方提供的,使用起來比 pthread

iOS執行小結( NSOperation

一) NSOperation使用方法: NSOperation 例項封裝了需要執行的操作和執行操作所需的資料,並且能夠以併發或非併發的方式執行這個操作。NSOperation在ios4後也基於GCD實現,但是相對於GCD來說可控性更強,並且可以加入操作依賴。N

ios執行操作(十二)—— 自定義NSOperation實現網路下載後回撥

- (void)main { @autoreleasepool { // 下載圖片的耗時操作 NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSDa

iOS執行程式設計技術NSThread、Cocoa NSOperation、GCD三者使用詳解

簡介 iOS有三種多執行緒程式設計的技術,分別是:(一)NSThread (二)Cocoa NSOperation (三)GCD(全稱:Grand Central Dispatch)三種方式的優缺點介紹: 1)NSThread優點:NSThread 比其他兩個輕量級缺點

iOS執行學習之NSOperation(一)

 什麼是NSOperation呢?有什麼用呢?和GCD相比有什麼不同呢?或者優勢呢? NSOperation底層實現是基於GCD的,比GCD多了一些簡單使用的功能,使用更加面向物件 作用:配合使用NSOperation 和 NSOperationQueue也能實現多執行緒

iOS執行——你要知道的NSOperation都在這裡

你要知道的iOS多執行緒NSThread、GCD、NSOperation、RunLoop都在這裡 本系列文章主要講解iOS中多執行緒的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法詳解,本系列文章不涉及基礎的執行緒

iOS 執行(三)NSOperation

NSOperation NSOperation是蘋果封裝的一套多執行緒的東西,不像GCD是純C語言的,這個是OC的。但相比較之下GCD會更快一些,但本質上NSOPeration是多GDC的封裝。 NSOperation相對於GCD: NSOperation擁有更多

iOS執行整理 (精)

知識點梳理 1.執行緒程序的區別: > 程序:應用程式的例項 > 執行緒:任務排程的基本單元 2.佇列種類: 序列佇列、併發佇列、主佇列(有經過特殊處理的序列佇列)、全域性佇列(屬於併發佇列) > 序列佇列:佇列中的任務按順序一個一個執行,任務的執行必

iOS執行筆記(GCD理解)

0x00 先上腦圖 0x01 iOS的三種多執行緒技術 1.NSThread 每個NSThread物件對應一個執行緒,量級較輕(真正的多執行緒)2.以下兩點是蘋果專門開發的“併發”技術,使得程式設計師可以不再去關心執行緒的具體使用問題ØNSOperation/NSOperationQueue 面向物件的

iOS 執行中的鎖

鎖的分類以及簡單介紹 一. 鎖的分類 互斥鎖 互斥鎖是一種訊號量,一次只允許訪問一個執行緒。如果正在使用互斥鎖並且另一個執行緒試圖獲取它,則該執行緒將阻塞,直到互斥鎖被其原始持有者釋放。如果多個執行緒競爭相同的互斥鎖,則一次只允許一個互斥鎖訪問它。 遞迴鎖定(也是互

iOS執行學習---NSThread

摘自:http://www.cnblogs.com/kenshincui/p/3983982.html 多執行緒 簡介 當用戶播放音訊、下載資源、進行影象處理時往往希望做這些事情的時候其他操作不會被中斷或者希望這些操作過程中更加順暢。在單執行緒中一個執行緒只能做一

iOS執行——你要知道的NSThread都在這裡

你要知道的iOS多執行緒NSThread、GCD、NSOperation、RunLoop都在這裡 本系列文章主要講解iOS中多執行緒的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法詳解,本系列文章不涉及基礎的執行緒

ios執行初步,主執行重新整理UI

去研究一下iOS多執行緒的起因是自己程式裡用了一個等待指示器UIActivityIndicatorView,俗稱小菊花。但是在給頂層ViewController用addsubview加入這個控制元件並使轉動時,螢幕並沒有出現菊花。經過好一番除錯都沒找到原因。去網

iOS 執行初步研究-NSThread

對於多執行緒的開發,iOS系統提供了多種不同的介面,先談談iOS多執行緒最基礎方面的使用。產生執行緒的方式姑且分兩類,一類是顯式呼叫,另一類是隱式呼叫。 一、顯示呼叫的類為NSThread。一般構造NSThread的執行緒物件可通過兩種方式: 1. 初始化執行緒主方法: [NSThread deta