文档章节

NSOperation

BookSun
 BookSun
发布于 2016/02/15 20:36
字数 523
阅读 2
收藏 0

// AFNetWorking 3.0 完全都是用NSOperation 来实现多线程

//   GCD

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    //  抽象父类,只定义了方法,没有实现

    //NSInvocationOperation 创建一个线程

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

    //启动 是没有用的,他会在我们的主线程中执行

//    [ivc start];

    

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

    

//    [ivc2 start];

    

    //线程队列

    //主线程队列

    [NSOperationQueue mainQueue];

    

    

    //创建一个线程队列

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

    

    //设置线程依赖,ivc2依赖1,设置依赖要在,线程添加在队列之前(只要把线程添加到队列里面,队列会会管理线程的执行)

    //你添加到队列里面两个线程,不一定就创建了两个线程,因为系统根据CPU使用情况,自动的去判断。

    [ivc2 addDependency:ivc];

    

    //第二种创建NSOperation线程的方法

    NSBlockOperation * blockOp = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"block op %@",[NSThread currentThread]);

    }];

    //添加到队列里面

    [queue addOperation:blockOp];

    

    //NSOpertation要添加到线程队列里面)把线程添加到线程队列里面,不用手动的启动,系统会自己安排启动,

    [queue addOperation:ivc];

    [queue addOperation:ivc2];

    

    

    //控制队列的最大同时执行数量,并发数

    queue.maxConcurrentOperationCount = 2;

    

    //需要去检测线程的状态

    // KVO 键值观察 ,观察我们队列的 线程数量

    [queue addObserver:self forKeyPath:@"operationCount" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:NULL];

    

}

// 用这个方法(addObserver: forKeyPath: options:)实现键值观察 ,必须要实现 observeValueForKeyPath,来监听变化

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {

    //监听 operationCount 的值,如果等于0 说明当前队列的线程已经执行完毕。

    if ([change[@"new"] integerValue] == 0) {

        NSLog(@"线程已经执行完毕");

        NSLog(@"%@",[NSThread currentThread]);

        

        //如果要刷新UI的话,就必须回到主线才能刷新

        [self performSelectorOnMainThread:@selector(backMainThread) withObject:nil waitUntilDone:NO];

    }

}

- (void)backMainThread {

    //打印当前方法名

    NSLog(@"%s",__func__);

    NSLog(@"%@",[NSThread currentThread]);

}

- (void)doThing2 {


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

          NSLog(@"dot thing 2 ........ %@",[NSThread currentThread]);

    }

    


}


- (void)doThing {

    //打印了 当前线程

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

        NSLog(@"dot thing 1 ........ %@",[NSThread currentThread]);

    }

    

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


© 著作权归作者所有

上一篇: Size Class
下一篇: NSThreadDownload
BookSun
粉丝 0
博文 12
码字总数 2513
作品 0
郑州
程序员
私信 提问
iOS之[多线程:NSOperation]

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

言筱羽
2015/11/23
95
0
【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的。但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装。 一、NSOperation与GCD的比较 GCD是基于c的底层...

xn4545945
2014/07/28
0
0
iOS多线程之NSOperation

1.简介 1.1NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1.2NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation...

JlongTian
2016/01/10
33
0
NSOperationQueue

NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤先将需要执行的操作封装到一个NSOperation对象中然后将NSO...

5vinsEnt
2016/05/25
10
0
iOS OS X 和 iOS 中的多线程技术-4 (NSOperation)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一NSOperation: 1.NSOperation做的事情比 NSThread 更多一些。通过继承 NSOperation,可以使子类获得一些线程相关的特性,进而可以安全地管理线...

石虎132
2017/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一文读懂深度学习:从神经元到BERT

阿里妹导读:自然语言处理领域的殿堂标志 BERT 并非横空出世,背后有它的发展原理。今天,蚂蚁金服财富对话算法团队整理对比了深度学习模型在自然语言处理领域的发展历程。从简易的神经元到当...

阿里云云栖社区
8分钟前
3
0
诊断修复 TiDB Operator 在 K8s 测试中遇到的 Linux 内核问题

作者:张文博 Kubernetes(K8s)是一个开源容器编排系统,可自动执行应用程序部署、扩展和管理。它是云原生世界的操作系统。 K8s 或操作系统中的任何缺陷都可能使用户进程存在风险。作为 Pi...

TiDB
18分钟前
1
0
分享一个vue项目“脚手架”项目的实现步骤

搭建缘由 源于公司每次新启动一个由多人协同开发的项目都由负责人初始化项目之后,每个人再去从私服pull一下项目才开始开发。但是每次初始化工程都是一步步的造轮子,一个个依赖去安装,新建...

开元中国2015
55分钟前
4
0
Odoo 自定义Widgets 基础教程(章节2)

大家好, 本文将进一步解释odoo widget 的相关原理,其中首先会讲述:1. 什么是widgets 中的继承;2. 为什么有很多 init : function 语法;3. widgets 系统结构; 首先,让我们来看看结构:(...

openerp
今天
3
0
我的Linux常用软件

我的Linux常用软件 本帖记录我在Linux下常用的软件,系统是Deepin Linux, 以备查询用, 不定期更新。 Sougou Pinyin 这个不用多说, 装系统第一个要找输入法。 TeamViewer Linux有时候需要远...

Frank1126lin
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部