#import "ViewController.h"

 @interface ViewController ()

 @end

 @implementation ViewController

 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

     [self BlockOperation];

 }

 -(void)BlockOperation{
//1.创建任务
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"op1----%@", [NSThread currentThread]);
}] ; NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"op2----%@", [NSThread currentThread]);
}] ; NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"op3----%@", [NSThread currentThread]);
}] ; //2.追加任务 注意:如果一个线程中的任务数量大于1,那么会开子线程并发执行任务,会开子线程但是不一定所有任务都在子线程运行,有可能某个任务是在主线程执行
[op3 addExecutionBlock:^{
NSLog(@"op4----%@", [NSThread currentThread]);
}]; [op3 addExecutionBlock:^{
NSLog(@"op5 ----%@", [NSThread currentThread]);
}]; //3.操作监听, 可以放到任何位置,这个block也是并发执行的,不是一定在执行完op3 就会执行,他们不一定在同一个线程
op3.completionBlock = ^{
NSLog(@"op3.completionBlock=====");
}; //4.启动操作
// [op1 start];
// [op2 start];
// [op3 start]; //5.依赖需要添加到队列之前,可以跨队列依赖,并且不能循环依赖,循环依赖不会执行循环的代码, 执行其他的
[op1 addDependency:op2];
[op2 addDependency:op3]; //6. 创建非主队列, 主队列是[NSOperationQueue mainQueue]
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperationQueue *queue2 = [[NSOperationQueue alloc] init]; //7、添加任务 使用继承的方法可以看到 执行顺序 是 [op3 start]方法 - main 方法
     [queue addOperation:op3];//默认添加了 [op3 start]方法
[queue addOperation:op1];//默认添加了 [op1 start]方法
[queue2 addOperation:op2];//默认添加了 [op2 start]方法 //8.线程同时执行的数量 线程同时执行的数量,-1是最大值, 0是同步执行(打印结果线程不是一样的, 但是执行顺序 一定是1234,打印多少次都是1234),
queue.maxConcurrentOperationCount = ; //9.简便添加方法 这个等于 步骤1 和步骤4 ,但是没办法添加依赖和监听,看具体使用环境 一般回到主队列刷新UI使用
[queue addOperationWithBlock:^{
NSLog(@"op110 ----%@", [NSThread currentThread]);
}]; [[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"回到主队列了-%@", [NSThread currentThread]);
}];
} -(void)InvocationOperation{
/**
参数1:使用对象
参数2:调用方法名称
参数3:前面方法需要参数
*/
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downLoad) object:nil]; //开启线程
[op1 start];
// op1.cancel; // [self downLoad]; //这个和上边 两行一样。。。
} -(void)downLoad{
NSLog(@"%s----%@", __func__, [NSThread currentThread]);
}
@end

OC 线程操作3 - NSOperation的更多相关文章

  1. OC 线程操作3 - NSOperation 实现线程间通信

    #import "ViewController.h" @interface ViewController () /** 图片 */ @property (weak, nonatom ...

  2. OC 线程操作2 - NSThread

        方法1 :直接创建 alloc init - (void)createNSThread111{ /* 参数1: (nonnull id) 目标对象 self 参数2:(nonnull SEL) ...

  3. OC 线程操作 - GCD队列组

    1.队列组两种使用方法2.队列组等待 wait /** 新方法 队列组一般用在在异步操作,在主线程写队列组毫无任何作用 */ - (void)GCD_Group_new_group___notify{ ...

  4. OC 线程操作 - GCD快速迭代

    - (void)forDemo{ //全都是在主线程操作的 ; i<; i++) { NSLog(@"--%@", [NSThread currentThread]); } ...

  5. OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...

  6. OC 线程操作1 - pthread

    #import "ViewController.h" #import <pthread.h> //1.需要包含这个头文件 @interface ViewControll ...

  7. OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self downImag ...

  8. OC 线程操作 - GCD使用 - 栅栏函数

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //同步函数无需栅栏函数 //栅栏 ...

  9. OC线程操作-GCD介绍

    1. GCD介绍 1.11.2 1.3 异步具备开启能力但是不是 一定可以开启 1.4 1.5 67. 8.

随机推荐

  1. pdb调试工具

    调试--pdb pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++). 命令 简写命令 作用 break b 设置断点 continue c 继续执行程序 list l 查看当前行的 ...

  2. C基本语句和运算符

    1,逗号运算符

  3. js改变div高度

    用bootsrap响应式布局的时候,遇到个很恶心的问题:左边栏很短很难看!! 于是,想用js来自动改变左边的高度,没成功!!原来是设置的时候,没加单位,坑爹了. 参考:http://blog.sina ...

  4. 面向过程中的局部变量(global)

    1.school = 'oldboy.edu' def change_name(name): school = " Mage Linux"                  # 局 ...

  5. Simple2D-21(重构)渲染部分

    以前 Simple2D 的渲染方法是先设置 Pass,然后添加顶点数据,相同 Pass 的顶点数据会合并在一起.当设置新的 Pass 时,将旧的 Pass 和对应的顶点数据添加到渲染数组中.最后在帧结 ...

  6. 8 python time$datetime

    1.表示时间的方式 (1)时间戳 时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 我们运行“type(time.time())” ...

  7. UI5-文档-4.15-Nested Views

    我们的面板内容变得越来越复杂,现在是时候将面板内容移动到一个单独的视图中了.使用这种方法,应用程序结构更容易理解,应用程序的各个部分可以重用. Preview The panel content is ...

  8. 【转】.net 实现 语音搜索(仅限WebKit内核浏览器)

    <input type="text" class="text" name="value_2" id="value_2&quo ...

  9. 自动选择最佳特征进行分类-SVM (Halcon)

    HALCON12里的example,classify_pills_auto_select_features.hdev. 执行流程: 1.选取相关特征(本例选取color和region组的所有特征)(本 ...

  10. Spring Boot中启动HTTPS

    一,生成https 的证书 1,在相应的根目录下 keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize -keyst ...