文档章节

Objective-C-NSOperation

BKF_
 BKF_
发布于 2016/03/03 14:09
字数 413
阅读 6
收藏 0

NSOpseration是抽象基类,所以要用子类实现它的方法。(内部使用gcd实现)
1.一个NSOperation 就代表一个任务,任务的代码分装在block里或者函数里。
    OC提供子类:
        NSInvocztionOperation:任务是一个函数,比较长
        NSBlockOperation:任务是一个block,比较短

常用方法demo:(有关线程执行方式,队列类型看这里

1.1NSBlockOperation:

- (void) testBlockOperation2
{
    //情况1.
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"startA:%@", [NSThread currentThread]);
    }];
    [operationA start];
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"startB:%@", [NSThread currentThread]);
    }];
    [operationB start];
    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"startC:%@", [NSThread currentThread]);
    }];
    [operationC start];
    
    //情况2.
    NSBlockOperation *operation = [[ NSBlockOperation alloc] init];
    [operation addExecutionBlock:^{
        NSLog(@"start1:%@", [NSThread currentThread]);
    }];
    
    [operation addExecutionBlock:^{
        NSLog(@"start2:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"start3:%@", [NSThread currentThread]);
    }];
    [operation start];
}


可以看到任务配置好以后,直接执行时同步的。而把任务block放到一起的时候是异步的。

- (void) testBlockOperation
{
    //情况3.
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"start1:%@", [NSThread currentThread]);
    }];
    
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"start2:%@", [NSThread currentThread]);
    }];
    
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"start3:%@", [NSThread currentThread]);
    }];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];
}


放到全局队列里也是异步的(并发),如果放到主队列([NSOperationQueue mainQueue])里,那么是同步的。


1.2NSInvocztionOperation:使用它和NSBlockOperation是一样的。都是NSOperation的子类……

- (void) testOperationInvocation{
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationFirst:) object:@"start"];
    [operation1 start];
    
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationFirst:) object:@"newQ"];
    [queue addOperation:operation2];
}

- (void) operationFirst:(NSString *) who
{
    NSLog(@"\n%@, %s, %@", who, __func__, [NSThread currentThread]);
}


2.任务间依赖关系:也是用来实现异步线程间通信的一种约定

- (void) operationDependency
{
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"thread 1");
    }];
    [operation1 setCompletionBlock:^{
        NSLog(@"finish thread1");
    }];
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"thread 2");
    }];
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"thread 3");
    }];
    
    [operation1 addDependency:operation2];
    [operation2 addDependency:operation3];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}

依据依赖顺序执行




© 著作权归作者所有

共有 人打赏支持
BKF_
粉丝 1
博文 21
码字总数 4291
作品 0
广州
iOS GCD~performSelector、dispatch_once、NSOperation总结

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、使用GCD 替代 performSelector 系列方法 NSObject 的 performSelector 系列方法有很多限制。传给要执行的方法的参数的数量是有限制的,也没...

石虎132
2017/12/05
0
0
iOS技术面试题

收集了一些iOS技术面试题,试试你能通过吗? iOS知识问题: Difference between shallow copy and deep copy? What is advantage of categories? What is difference between implementing ......

长平狐
2012/08/13
1K
0
iOS OS X 和 iOS 中的多线程技术-1

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念 多线程的目的是,通过并发执行提高 CPU 的使用效率,进而提供程序运行效率。 OS X 和 iOS 是多线程操作系统,它们追随 UNIX 系统使用...

石虎132
2017/11/21
0
0
iOS之[多线程:NSOperation]

NSOperation :fa-exclamation-triangle:以下是你需要考虑使用 NSOperation 的一些理由: 1.当你需要取消线程任务时,GCD 无法提供取消任务的操作。而 NSOperation 提供了取消任务的操作; 2.当...

言筱羽
2015/11/23
95
0
关于iOS多线程

关于iOS多线程 原文地址:http://www.jianshu.com/p/0b0d9b1f1f19 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实...

法斗斗
2016/03/10
15
0

没有更多内容

加载失败,请刷新页面

加载更多

理解数据库的4种隔离级别

本文转自:http://m.blog.csdn.net/article/details?id=51924963 数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,...

初雪之音
28分钟前
1
0
主流的消息队列MQ比较,详解MQ的4类应用场景

目前主流的MQ 1.ZeroMQ 号称最快的消息队列系统,尤其针对大吞吐量的需求场景。 扩展性好,开发比较灵活,采用C语言实现,实际上只是一个socket库的重新封装,如果做为消息队列使用,需要开发...

游人未归
今天
4
0
React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
今天
4
0
Jenkins使用

clean install -Dmaven.test.skip=true 系统设置 全局工具配置 其他的配置类似 构建项目配置

1713716445
今天
2
0
多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部