亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS多線程應用開發中使用NSOperation類的基本方法

2020-07-26 03:32:16
字體:
來源:轉載
供稿:網友

一、NSOperation簡介

1.簡單說明

NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能實現多線程編程

NSOperation和NSOperationQueue實現多線程的具體步驟:

(1)先將需要執行的操作封裝到一個NSOperation對象中

(2)然后將NSOperation對象添加到NSOperationQueue中

(3)系統會⾃動將NSOperationQueue中的NSOperation取出來

(4)將取出的NSOperation封裝的操作放到⼀條新線程中執⾏

 2.NSOperation的子類

NSOperation是個抽象類,并不具備封裝操作的能力,必須使⽤它的子類

使用NSOperation⼦類的方式有3種:

(1)NSInvocationOperation

(2)NSBlockOperation

(3)自定義子類繼承NSOperation,實現內部相應的⽅法

二、 具體說明

1.NSInvocationOperation子類

創建對象和執行操作:

復制代碼 代碼如下:

//創建操作對象,封裝要執行的任務
    //NSInvocationOperation   封裝操作
    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
   
    //執行操作
    [operation start];

說明:一旦執⾏操作,就會調用target的test方法

代碼示例:

復制代碼 代碼如下:

//
//  YYViewController.m
//  01-NSOperation基本1
//
//  Created by 孔醫己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //NSOperation:抽象類,不具備封裝功能
   
    //創建操作對象,封裝要執行的任務
    //NSInvocationOperation   封裝操作
    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
   
    //執行操作
    [operation start];

}

-(void)test
{
   
    NSLog(@"--test--%@--",[NSThread currentThread]);
}
@end


打印查看:

2015111391700829.png (797×26)

注意:操作對象默認在主線程中執行,只有添加到隊列中才會開啟新的線程。即默認情況下,如果操作沒有放到隊列中queue中,都是同步執行。只有將NSOperation放到一個NSOperationQueue中,才會異步執行操作

2.NSBlockOperation子類

創建對象和添加操作:

復制代碼 代碼如下:

//創建NSBlockOperation操作對象
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
        //......
    }];
   
    //添加操作
    [operation addExecutionBlock:^{
        //....
    }];

代碼示例:

代碼1:

復制代碼 代碼如下:

//
//  YYViewController.m
//  02-NSTherad基本2
//
//  Created by 孔醫己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //創建NSBlockOperation操作對象
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
    }];
   
   
    //開啟執行操作
    [operation start];
}
@end


打印查看:

2015111391736283.png (812×26)

代碼2:

復制代碼 代碼如下:

//
//  YYViewController.m
//  02-NSTherad基本2
//
//  Created by 孔醫己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //創建NSBlockOperation操作對象
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
    }];
   
    //添加操作
    [operation addExecutionBlock:^{
        NSLog(@"NSBlockOperation1------%@",[NSThread currentThread]);
    }];
   
    [operation addExecutionBlock:^{
        NSLog(@"NSBlockOperation2------%@",[NSThread currentThread]);
    }];
   
    //開啟執行操作
    [operation start];
}
@end


2015111391842936.png (820×63)

注意:只要NSBlockOperation封裝的操作數 > 1,就會異步執行操作

3.NSOperationQueue

NSOperationQueue的作⽤:NSOperation可以調⽤start⽅法來執⾏任務,但默認是同步執行的

如果將NSOperation添加到NSOperationQueue(操作隊列)中,系統會自動異步執行NSOperation中的操作

添加操作到NSOperationQueue中,自動執行操作,自動開啟線程

復制代碼 代碼如下:

//創建NSOperationQueue
    NSOperationQueue * queue=[[NSOperationQueue alloc]init];
    //把操作添加到隊列中
    //第一種方式
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    //第二種方式
    [queue addOperationWithBlock:^{
        NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
    }];

復制代碼 代碼如下:

- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;

代碼示例:
復制代碼 代碼如下:

//
//  YYViewController.m
//  03-NSOperation基本3
//
//  Created by 孔醫己 on 14-6-25.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //創建NSInvocationOperation對象,封裝操作
    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
    //創建對象,封裝操作
    NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
    }];
    [operation3 addExecutionBlock:^{
        NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
    }];
   
    //創建NSOperationQueue
    NSOperationQueue * queue=[[NSOperationQueue alloc]init];
    //把操作添加到隊列中
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}


復制代碼 代碼如下:

-(void)test1
{
    NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
}

-(void)test2
{
    NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
}

@end


打印效果:

2015111392029822.png (900×83)

注意:系統自動將NSOperationqueue中的NSOperation對象取出,將其封裝的操作放到一條新的線程中執行。上面的代碼示例中,一共有四個任務,operation1和operation2分別有一個任務,operation3有兩個任務。一共四個任務,開啟了四條線程。通過任務執行的時間全部都是273可以看出,這些任務是并行執行的。

提示:隊列的取出是有順序的,與打印結果并不矛盾。這就好比,選手A,BC雖然起跑的順序是先A,后B,然后C,但是到達終點的順序卻不一定是A,B在前,C在后。
下面使用for循環打印,可以更明顯的看出任務是并發執行的。

代碼示例:

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //創建NSInvocationOperation對象,封裝操作
    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
    //創建對象,封裝操作
    NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<5; i++) {
            NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
        }
    }];
    [operation3 addExecutionBlock:^{
        for (int i=0; i<5; i++) {
        NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
        }
    }];
   
    //創建NSOperationQueue
    NSOperationQueue * queue=[[NSOperationQueue alloc]init];
    //把操作添加到隊列中
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}

-(void)test1
{
    for (int i=0; i<5; i++) {
    NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
    }
}

-(void)test2
{
    for (int i=0; i<5; i++) {
    NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
    }
}

@end


2015111392049597.png (889×273)

三、并發數
(1)并發數:同時執⾏行的任務數.比如,同時開3個線程執行3個任務,并發數就是3
(2)最大并發數:同一時間最多只能執行的任務的個數。
(3)最⼤大并發數的相關⽅方法

復制代碼 代碼如下:

- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;


說明:如果沒有設置最大并發數,那么并發的個數是由系統內存和CPU決定的,可能內存多久開多一點,內存少就開少一點。
注意:num的值并不代表線程的個數,僅僅代表線程的ID。
提示:最大并發數不要亂寫(5以內),不要開太多,一般以2~3為宜,因為雖然任務是在子線程進行處理的,但是cpu處理這些過多的子線程可能會影響UI,讓UI變卡。

四、隊列的取消,暫停和恢復
 (1)取消隊列的所有操作

復制代碼 代碼如下:

 - (void)cancelAllOperations;

提⽰:也可以調用NSOperation的- (void)cancel⽅法取消單個操作

 (2)暫停和恢復隊列

復制代碼 代碼如下:

- (void)setSuspended:(BOOL)b; // YES代表暫停隊列,NO代表恢復隊列

- (BOOL)isSuspended; //當前狀態


(3)暫停和恢復的適用場合:在tableview界面,開線程下載遠程的網絡界面,對UI會有影響,使用戶體驗變差。那么這種情況,就可以設置在用戶操作UI(如滾動屏幕)的時候,暫停隊列(不是取消隊列),停止滾動的時候,恢復隊列。

五、操作優先級
 (1)設置NSOperation在queue中的優先級,可以改變操作的執⾏優先級

復制代碼 代碼如下:

- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;

 (2)優先級的取值
復制代碼 代碼如下:

NSOperationQueuePriorityVeryLow = -8L,

NSOperationQueuePriorityLow = -4L,

NSOperationQueuePriorityNormal = 0,

NSOperationQueuePriorityHigh = 4,

NSOperationQueuePriorityVeryHigh = 8


說明:優先級高的任務,調用的幾率會更大。

六、操作依賴
(1)NSOperation之間可以設置依賴來保證執行順序,⽐如一定要讓操作A執行完后,才能執行操作B,可以像下面這么寫

復制代碼 代碼如下:

[operationB addDependency:operationA]; // 操作B依賴于操作

(2)可以在不同queue的NSOperation之間創建依賴關系

2015111392125598.png (388×187)

注意:不能循環依賴(不能A依賴于B,B又依賴于A)。

(3)代碼示例

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //創建NSInvocationOperation對象,封裝操作
    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
    //創建對象,封裝操作
    NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<5; i++) {
            NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
        }
    }];
    [operation3 addExecutionBlock:^{
        for (int i=0; i<5; i++) {
        NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
        }
    }];
   
    //設置操作依賴
    //先執行operation2,再執行operation1,最后執行operation3
    [operation3 addDependency:operation1];
    [operation1 addDependency:operation2];
   
    //不能是相互依賴
//    [operation3 addDependency:operation1];
//    [operation1 addDependency:operation3];
   
    //創建NSOperationQueue
    NSOperationQueue * queue=[[NSOperationQueue alloc]init];
    //把操作添加到隊列中
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}


復制代碼 代碼如下:

-(void)test1
{
    for (int i=0; i<5; i++) {
    NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
    }
}

-(void)test2
{
    for (int i=0; i<5; i++) {
    NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
    }
}

@end


打印查看:

2015111392149398.png (907×305)

A做完再做B,B做完才做C。
注意:一定要在添加之前,進行設置。
提示:任務添加的順序并不能夠決定執行順序,執行的順序取決于依賴。使用Operation的目的就是為了讓開發人員不再關心線程。
 
 
5.操作的監聽
可以監聽一個操作的執行完畢

復制代碼 代碼如下:

- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;

代碼示例

第一種方式:可以直接跟在任務后面編寫需要完成的操作,如這里在下載圖片后,緊跟著下載第二張圖片。但是這種寫法有的時候把兩個不相關的操作寫到了一個代碼塊中,代碼的可閱讀性不強。

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()

@end

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //創建對象,封裝操作
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"-operation-下載圖片-%@",[NSThread currentThread]);
        //.....下載圖片后繼續進行的操作
        NSLog(@"--接著下載第二張圖片--");
    }];
    
    //創建隊列
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    //把任務添加到隊列中(自動執行,自動開線程)
    [queue addOperation:operation];
}

@end


第二種方式:
復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //創建對象,封裝操作
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<10; i++) {
            NSLog(@"-operation-下載圖片-%@",[NSThread currentThread]);
        }
    }];
   
    //監聽操作的執行完畢
    operation.completionBlock=^{
        //.....下載圖片后繼續進行的操作
        NSLog(@"--接著下載第二張圖片--");
    };
   
    //創建隊列
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    //把任務添加到隊列中(自動執行,自動開線程)
    [queue addOperation:operation];
}

@end


打印查看:

2015111392210341.png (880×155)

說明:在上一個任務執行完后,會執行operation.completionBlock=^{}代碼段,且是在當前線程執行(2)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲黄一区二区| 欧美在线观看网址综合| 亚洲精品动漫久久久久| 亚洲精品美女网站| 欧美性理论片在线观看片免费| 日本精品va在线观看| 另类视频在线观看| 日产日韩在线亚洲欧美| 欧美激情视频免费观看| 韩国19禁主播vip福利视频| 91香蕉电影院| 国产精品主播视频| 国产香蕉一区二区三区在线视频| 精品国产依人香蕉在线精品| 亚洲美女激情视频| 色偷偷88888欧美精品久久久| 亚洲精品www久久久| 欧美日韩在线观看视频| 国产精品69精品一区二区三区| 视频在线观看一区二区| 国产精品视频播放| 久久久久久久久综合| 欧美韩日一区二区| 丝袜美腿精品国产二区| 中文字幕亚洲精品| 亚洲伊人成综合成人网| 国产成人激情视频| 欧美精品在线第一页| 欧美不卡视频一区发布| 欧美大片在线看免费观看| 日本亚洲欧美成人| 色偷偷9999www| 欧美精品一区三区| 欧美午夜xxx| 欧美激情影音先锋| 国产成人在线亚洲欧美| 视频在线一区二区| 精品国内亚洲在观看18黄| 38少妇精品导航| 日韩中文在线视频| 7777精品久久久久久| 亚洲精品色婷婷福利天堂| 欧美黑人巨大xxx极品| 成人久久久久久久| 中文字幕综合一区| 久久亚洲国产成人| 亚洲第五色综合网| 日韩免费电影在线观看| 日本三级韩国三级久久| 亚洲精品日韩丝袜精品| 国产亚洲精品日韩| 91久久中文字幕| 欧美一级高清免费播放| 中文字幕亚洲自拍| 欧美性猛交视频| 欧美成人午夜视频| 精品视频久久久久久久| 国产精品成人一区二区三区吃奶| 欧美体内谢she精2性欧美| 午夜精品在线观看| 成人国产亚洲精品a区天堂华泰| 精品亚洲一区二区三区四区五区| 日韩在线中文字| 久久视频在线播放| 91九色国产在线| 国产精品普通话| 国产精品网站视频| 国产日韩欧美在线观看| 欧美在线激情视频| 国产精品av在线播放| 色综合天天狠天天透天天伊人| 91九色精品视频| 欧美激情亚洲另类| 中文在线资源观看视频网站免费不卡| 91中文精品字幕在线视频| 亚洲国产天堂久久综合网| 成人动漫网站在线观看| 奇米4444一区二区三区| 亚洲最大的网站| 精品高清美女精品国产区| 日本一区二三区好的精华液| 成人妇女免费播放久久久| 91沈先生在线观看| 国产精品一区二区三| 国产黑人绿帽在线第一区| 国产精品扒开腿爽爽爽视频| 777午夜精品福利在线观看| 午夜精品久久17c| 亚洲午夜女主播在线直播| 亚洲天堂色网站| 亚洲一区二区三| 亚洲影院高清在线| 亚洲国产福利在线| 国产在线观看不卡| 亚洲美女久久久| 中文字幕欧美日韩| 欧美成人三级视频网站| 这里只有精品久久| 亚洲色图校园春色| 中文字幕日韩在线观看| 国产精品成人一区二区三区吃奶| 欧美亚洲第一区| 日韩视频免费在线观看| 亚洲自拍小视频免费观看| 欧美在线观看一区二区三区| 国产亚洲综合久久| 国产一区二区三区毛片| 亚洲欧美激情另类校园| 日韩av电影手机在线| 视频在线观看一区二区| 国内精品模特av私拍在线观看| 丝袜美腿精品国产二区| 亚洲人成免费电影| 91av在线看| 欧美成人午夜激情| 成人美女免费网站视频| 久久久噜噜噜久久中文字免| yw.139尤物在线精品视频| 日韩在线观看免费| 伊人久久久久久久久久| 久久久免费在线观看| 欧美激情a在线| 日韩欧美在线视频| 欧美激情亚洲一区| 亚洲天堂av高清| 久久国产色av| 5566成人精品视频免费| 日本精品va在线观看| 亚洲一区二区久久久久久| 日韩精品中文字幕久久臀| 成人精品在线观看| 色播久久人人爽人人爽人人片视av| 亚洲直播在线一区| 国产精品2018| 日韩亚洲欧美中文高清在线| 91夜夜揉人人捏人人添红杏| 久久久久国产精品免费| 91视频8mav| 亚洲偷熟乱区亚洲香蕉av| 欧美日韩国产一区二区三区| 国产精品69久久| 日韩中文字幕网址| 久久影视免费观看| 亚洲视频第一页| 久久成人精品视频| 日韩av在线天堂网| 日韩欧美福利视频| 亲子乱一区二区三区电影| 亚洲精品网站在线播放gif| 最新69国产成人精品视频免费| 岛国av一区二区三区| 日本欧美精品在线| 日韩欧美一区二区三区| 国产欧美精品在线| 国产精品91久久| 国产精品av在线| 欧美在线观看日本一区| 色综合久综合久久综合久鬼88| 国产精品稀缺呦系列在线| 亚洲精品www久久久久久广东| 美日韩精品免费观看视频| 国产精品久久久久久av福利软件| 萌白酱国产一区二区| 欧洲精品毛片网站|