#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. freemarker ,DEFAULT_INCOMPATIBLE_IMPROVEMENTS 找不到

    一般出现这种问题的原因是,spring的版本和freemarker不匹配造成的~ nested exception is org.springframework.beans.factory.BeanC ...

  2. Web API源码剖析之HttpServer

    Web API源码剖析之HttpServer 上一节我们讲述全局配置.本节将讲述全局配置的DefaultServer,它是一个HttpServer类型. 主要作用就是接受每一次请求,然后分发给消息处理 ...

  3. MySQL ALTER讲解

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 开始本章教程前让我们先创建一张表,表名为:testalter_tbl. root@host# mysql -u r ...

  4. 腾讯优图联手Science发布主题报告:计算机视觉的研发和应用

    近日,腾讯优图与<科学>(Science)杂志共同发布<Seeing is believing: R&D applications of computer vision> ...

  5. 18. 进livebos对象直接跳转jsp页面的做法

    在网格脚本定义添加: window.onload=function(){     window.location.href='/plug-in/sinopec/contractManagement/h ...

  6. 24.OGNL与ValueStack(VS)-集合对象初步

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 首先在LoginAction中增加如下字段并提供相应的get/set方法: ...

  7. Spring boot Tomcat配置

    来自: https://www.cnblogs.com/a8457013/p/7687764.html

  8. Linux 如何将一个文件夹的所有内容授权给某一个用户

    我们可以使用chown命令,ch这里代表change(改变)的意思,own代表英文单词的owner(拥有者),连在一起就是 change owner ,改变某个文件或者文件夹的拥有者. 一般只有roo ...

  9. 概率论与数理统计 Q&A:

    --------------------------------- 大数定律:大量样本数据的均值(样本值之和除以样本个数),近似于随机变量的期望(标准概率*样本次数).(样本(部分)趋近于总体)中心极 ...

  10. C++ 11 中的 Lambda 表达式的使用

    Lambda在C#中使用得非常频繁,并且可以使代码变得简洁,优雅. 在C++11 中也加入了 Lambda. 它是这个样子的 [] () {}...  是的三种括号开会的节奏~ [] 的作用是表示La ...