美文网首页
NSOperation的用法

NSOperation的用法

作者: 慢慢爬的小蜗牛stone | 来源:发表于2017-08-28 20:03 被阅读0次

在ios多线程中,会涉及到pthread、NSThread、GCD、NSOperation,本文主要介绍NSOperation

一、队列(分为两种)

主队列:很明显,加入主队列的任务会在主线程同步执行。

非主队列:一般加入非主队列的任务,都会开启新线程异步执行。

二、NSOperation的基本用法

1.NSInvocationOperation的两种用法

  • 直接调用start
- (void)testInvocationOperation1{

// 创建操作任务

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@"www.testpng.com"];

// operation直接调用start,是同步执行(在当前线程执行操作),不会开启新线程

[operation start];

}

- (void)download:(NSString *)url{

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

}
执行结果
  • 把operation放入队列中执行

- (void)testInvocationOperation2{

// 创建队列(非主队列)

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

// 创建操作任务

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@"www.testpng.com"];

// 添加操作到队列中,会自动异步执行

[queue addOperation:operation];

}

- (void)download:(NSString *)url{

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

}

打印结果

2.NSBlockOperation的两种用法

  • 也是直接调start方法
- (void)testBlockOperation1{

// 直接调用start方法时,只有任务数量大于1是,才会开始开启新线程异步执行

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"---下载----1---%@", [NSThread currentThread]);

}];

[operation addExecutionBlock:^{

NSLog(@"---下载----2---%@", [NSThread currentThread]);

}];

[operation addExecutionBlock:^{

NSLog(@"---下载----3---%@", [NSThread currentThread]);

}];

[operation addExecutionBlock:^{

NSLog(@"---下载----4---%@", [NSThread currentThread]);

}];

[operation start];

}
打印结果
  • 把操作放入队列中执行
- (void)testBlockOperation2{

// 1.创建队列操作任务

NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"---下载----1---%@", [NSThread currentThread]);

}];

[operation1 addExecutionBlock:^{

NSLog(@"---下载----2---%@", [NSThread currentThread]);

}];

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"---下载----3---%@", [NSThread currentThread]);

}];

NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"---下载----4---%@", [NSThread currentThread]);

}];

NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"---下载----5---%@", [NSThread currentThread]);

}];

// 2.创建队列(非主队列)

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

// 3.添加操作到队列中(会开启新线程异步执行)

[queue addOperation:operation1];

[queue addOperation:operation2];

[queue addOperation:operation3];

[queue addOperation:operation4];

}
打印结果(因为是异步执行,执行没有严格的先后顺序)
  • 自定义operation

这种情况用的比较多,SDWebImage下载网络图片就是用这种。

来自SDWebImage截屏

这种用法一般都继承于NSOperation,并重写main或start方法(只要operation加入队列中就会触发这两个方法)。我写了个NSOperationDemo ,有兴趣可以看下。

三、队列的用法

1. 可以设置最大并发(最多同时并发执行几个任务)。

这可以提高完成任务效率,这在SDWebImage也有体现。

来自SDWebImage截屏

2.可以随时暂时、恢复和取消队列中的任务。

下载图片过程中,为了提高体验,一般都会在拖拽scrollView时暂停队列中的任务,停止滚动时恢复任务,当收到内存警告时,取消队列中所有任务(一旦取消,不可恢复)。

来自SDWebImage截屏

3.在异步执行中,要顺序执行,可以设置依赖

- (void)testDependency{

// 1.创建一个队列(非主队列)

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

// 2.创建操作任务

NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"先执行任务1---%@", [NSThread currentThread]);

}];

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"再执行任务2---%@", [NSThread currentThread]);

}];

NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"最后再执行任务3---%@", [NSThread currentThread]);

}];

// 3.设置依赖
[operation2 addDependency:operation1];

[operation3 addDependency:operation2];

// 4.添加操作到队列中(自动异步执行任务)

[queue addOperation:operation3];

[queue addOperation:operation2];

[queue addOperation:operation1];

}
打印结果

相关文章

  • 2018-11-18NSOperation

    记录NSOperation用法.

  • 多线程的记录

    链接:NSOperation的基本用法 NSOperation iOS dispatch_semaphore信号量...

  • NSOperation用法

    一,NSOperation简介 1,NSOperation是一个抽象类,需要使用子类实现具体的功能。2,NSOpe...

  • NSOperation的用法

    在ios多线程中,会涉及到pthread、NSThread、GCD、NSOperation,本文主要介绍NSOpe...

  • NSOperation 基础用法

    一、概念 NSOperation是一个多线程任务。NSOperation有NSInvocationOperatio...

  • NSOperation常见用法

    一提到多线程,脑海中大致会出现三种常用的方法NSThread,NSOperation,GCD。可是...你还在用G...

  • NSOperation ,NSOperationQueue用法

    基本概念 1、操作(Operation):在 NSOperation 中,我们使用 NSOperation 子类 ...

  • NSOperation的高级用法

    唠嗑 最近开始迁移文章,把以前写的一些文章都迁移到简书,也算开始在简书安家了。 前言 本文是对([WWDC 201...

  • GCD和NSOperation实现多线程调用

    GCD: 打印结果: NSOperation:第一种基本用法: 打印结果: 第二种基本用法: 打印结果: 这种方法...

  • NSOperation

    iOS多线程--彻底学会多线程之『NSOperation』 一. 基本用法 如果不创建BlockOperation...

网友评论

      本文标题:NSOperation的用法

      本文链接:https://www.haomeiwen.com/subject/zrmjdxtx.html