NSOperation、NSOperationQueue

一、使用NSOperation的子类来创建操作

1.NSInvocationOperation子类

//创建

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

    [oprationstart];

当不使用NSOperationQueue,默认是在主线程中执行

2.NSBlockOperation子类

 NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"当前线程1= in %@",[NSThread currentThread]);

    }];

    [operationaddExecutionBlock:^{

        NSLog(@"当前线程2= in %@",[NSThread currentThread]);

    }];

    [operationaddExecutionBlock:^{

        NSLog(@"当前线程3= in %@",[NSThread currentThread]);

    }];

    [operationaddExecutionBlock:^{

        NSLog(@"当前线程4= in %@",[NSThread currentThread]);

    }];

    [operationaddExecutionBlock:^{

        NSLog(@"当前线程5= in %@",[NSThread currentThread]);

    }];

    [operationstart];

当只使用NSBlockOperation时,默认是在当前线程执行,如果通过operationAddExectionBlock追加操作,则所有操作会在不同线程中执行。

3.自定义继承NSOperation 如果以上两种不能满足需求,则可以通过继承NSOperation类,实现自定义操作。在自定义类中重写main方法,实现自定义的功能。使用时实例化该类即可。

二、NSOperationQueue

1.NSOperationQueue创建包含两种:主队列和自定义队列(非主队列)

NSOperationQueue * queue = [NSOperationQueue mainQueue];// 创建主队列

NSOperationQueue * queue = [[NSOperationQueue alloc]init];//自定义队列

可以使用addOperation添加已经创建的操作到队列中,也可以使用addOperationWithBlock创建操作并添加到队列中。将多个操作添加到队列中,是异步处理。

2.最大并发操作数

NSOperationQueue通过 maxConcurrentOperationCount设置最大并发操作数,当count为1时,是串行队列,但是并不意味着只有一个线程,就像GCD串行队列中不一定只有一个线程一样。最大并发数不可无限大,系统会限定一个最大并发数值,如果你的值大于这个值,则以系统为准。

3.添加操作依赖、移除依赖、

NSOperation可以通过addDependency设置依赖关系。

// 1.创建队列

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    // 2.创建操作

    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

        for (int i = 0; i < 2; i++) {

            [NSThread sleepForTimeInterval:2]; // 模拟耗时操作

            NSLog(@"1---%@", [NSThread currentThread]); // 打印当前线程

        }

    }];

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

        for (int i = 0; i < 2; i++) {

            [NSThread sleepForTimeInterval:2]; // 模拟耗时操作

            NSLog(@"2---%@", [NSThread currentThread]); // 打印当前线程

        }

    }];

    // 3.添加依赖

    [op2 addDependency:op1]; // 让op2 依赖于 op1,则先执行op1,在执行op2

//    [op2 removeDependency:op1];//移除依赖关系

    // 4.添加操作到队列中

    [queue addOperation:op1];

    [queue addOperation:op2];

4.NSOperation优先级

NSOperation提供了queuePriority优先级属性,是个枚举值。同一个队列中可设置操作的优先级。依赖关系优先于优先级

5.线程间的通信

通过[[NSOperationQueue mainQueue]addOperationWithBlock:^{

}];执行回到主线程的操作

三、NSOperation和NSOperationQueue中的常用方法

NSOperation常用方法:

1.- (BOOL)isFinished; 判断操作是否已经结束。

2.- (BOOL)isCancelled;判断操作是否已经标记为取消。

3.- (BOOL)isExecuting;判断操作是否正在在运行。

4.- (BOOL)isReady; 判断操作是否处于准备就绪状态,这个值和操作的依赖关系相关。

5.- (void)waitUntilFinished; 阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。

6.- (void)setCompletionBlock:(void (^)(void))block; completionBlock 会在当前操作执行完毕时执行 completionBlock。

7.- (void)addDependency:(NSOperation *)op; 添加依赖,使当前操作依赖于操作 op 的完成

8.- (void)removeDependency:(NSOperation *)op; 移除依赖,取消当前操作对操作 op 的依赖。

9.@property (readonly, copy) NSArray<NSOperation *> *dependencies; 在当前操作开始执行之前完成执行的所有操作对象数组。

NSOperationQueue常用属性和方法

1.取消/暂停/恢复操作

- (void)cancelAllOperations;可以取消队列的所有操作。

- (BOOL)isSuspended;判断队列是否处于暂停状态。 YES 为暂停状态,NO 为恢复状态。

- (void)setSuspended:(BOOL)b;可设置操作的暂停和恢复,YES 代表暂停队列,NO 代表恢复队列。

2.操作同步

- (void)waitUntilAllOperationsAreFinished;阻塞当前线程,直到队列中的操作全部执行完毕。

3.添加/获取操作`

- (void)addOperationWithBlock:(void (^)(void))block;向队列中添加一个 NSBlockOperation 类型操作对象。

4.- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait;向队列中添加操作数组,wait 标志是否阻塞当前线程直到所有操作结束

5.- (NSArray *)operations;当前在队列中的操作数组(某个操作执行结束后会自动从这个数组清除)。

6.- (NSUInteger)operationCount;当前队列中的操作数。

7.获取队列

+ (id)currentQueue;获取当前队列,如果当前线程不是在 NSOperationQueue 上运行则返回 nil。

8.+ (id)mainQueue;获取主队列。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容