step 7 NSOperation(高级/GCD对比)

高级演练

全局队列

/// 全局操作队列,统一管理所有的异步操作

@property (nonatomic, strong) NSOperationQueue *queue;

- (NSOperationQueue *)queue {

if (_queue == nil) {

_queue = [[NSOperationQueue alloc] init];

}

return _queue;

}

最大并发操作数

/// MARK: - 最大并发操作数

- (void)opDemo1 {

// 设置同时并发操作数

self.queue.maxConcurrentOperationCount = 2;

NSLog(@"start");

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

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

[NSThread sleepForTimeInterval:1.0];

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

}];

[self.queue addOperation:op];

}

}

暂停 & 继续

/// MARK: - 暂停 & 继续

- (IBAction)pauseAndResume {

if (self.queue.operationCount == 0) {

NSLog(@"没有操作");

return;

}

// 暂停或者继续

self.queue.suspended = !self.queue.isSuspended;

if (self.queue.isSuspended) {

NSLog(@"暂停 %tu", self.queue.operationCount);

} else {

NSLog(@"继续 %tu", self.queue.operationCount);

}

}

  • 队列挂起,当前"没有完成的操作",是包含在队列的操作数中的
  • 队列挂起,不会影响已经执行操作的执行状态
  • 对列一旦被挂起,再添加的操作不会被调度

取消全部操作

/// MARK: - 取消所有操作

- (IBAction)cancelAll {

if (self.queue.operationCount == 0) {

NSLog(@"没有操作");

return;

}

// 取消对列中的所有操作,同样不会影响到正在执行中的操作!

[self.queue cancelAllOperations];

NSLog(@"取消全部操作 %tu", self.queue.operationCount);

}

1  取消队列中所有的操作

2  不会取消正在执行中的操作

3  不会影响队列的挂起状态

依赖关系

/// MARK: - 依赖关系

- (void)dependency {

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

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

}];

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

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

}];

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

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

}];

NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"通知用户 %@", [NSThread currentThread]);

}];

[op2 addDependency:op1];

[op3 addDependency:op2];

[op4 addDependency:op3];

// 注意不要循环依赖

//    [op1 addDependency:op4];

[self.queue addOperations:@[op1, op2, op3] waitUntilFinished:NO];

[[NSOperationQueue mainQueue] addOperation:op4];

NSLog(@"come here");

}

GCD 的对比

  • GCD

将任务(block)添加到队列(串行/并发/主队列),并且指定任务执行的函数(同步/异步)

GCD是底层的C语言构成的API

iOS 4.0 推出的,针对多核处理器的并发技术

在队列中执行的是由 block 构成的任务,这是一个轻量级的数据结构

要停止已经加入 queue 的 block 需要写复杂的代码

需要通过 Barrier 或者同步任务设置任务之间的依赖关系

只能设置队列的优先级

高级功能:

一次性 once

延迟操作 after

调度组

  • NSOperation

核心概念:把操作(异步)添加到队列(全局的并发队列)

OC 框架,更加面向对象,是对 GCD 的封装

iOS 2.0 推出的,苹果推出 GCD 之后,对 NSOperation 的底层全部重写

Operation作为一个对象,为我们提供了更多的选择

可以随时取消已经设定要准备执行的任务,已经执行的除外

可以跨队列设置操作的依赖关系

可以设置队列中每一个操作的优先级

高级功能:

最大操作并发数(GCD不好做)

继续/暂停/全部取消

跨队列设置操作的依赖关系

时间: 2024-08-04 10:17:05

step 7 NSOperation(高级/GCD对比)的相关文章

iOS开发-NSOperation与GCD区别

Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop,线程(包括Cocoa和POSIX)和Operation.GCD拥有非常轻量级的工作单元和并发方式,并且由系统决定其最佳调度方式.这个时候出现了一个问题,NSOperation如何处理呢? 其实我们在通过NSOperation和GCD进行开发过程中,会发现两者执行的方式有许多相似之处,NSOperat

多线程之NSThread、NSOperation及GCD

目录 1.NSThread 2.NSOperation 3.GCD 4.总结 这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 回到顶部 1.NSThread 创建线程主要有以下三种方式 需要注意的是对于多个线程可能同时访问一个对象的时候,使用“@synchronized”来解决这类线程同步问题. 在子线程中通知主线程通常使用以下两种办法: 回到顶部 2.NSOperation NSOpera

iOS开发笔记5:多线程之NSThread、NSOperation及GCD

这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方式 需要注意的是对于多个线程可能同时访问一个对象的时候,使用“@synchronized”来解决这类线程同步问题. 在子线程中通知主线程通常使用以下两种办法: 2.NSOperation NSOperation有三种使用方式,分别是NSInvocationOperation.NSBlockOpera

iOS 多线程 NSThread NSOperation NSOperationQueue GCD 线程锁 线程阻塞

iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的能力,所以一些数据层面可以开辟线程来操作进行,iOS线程的操作方法有NSThread NSOperation NSOperationQueue GCD: NSThread方法有 //NSThread自动 - (IBAction)didClickNSThreadAutoButtonActi

step 6 NSOperation (基本演练)

NSOperation 抽象类 NSOperation 是一个"抽象类",不能直接使用 抽象类的用处是定义子类共有的属性和方法 在苹果的头文件中,有些抽象类和子类的定义是在同一个头文件中的 子类: NSInvocationOperation (调用) NSBlockOperation (块) NSOperationQueue 队列 基本演练 NSInvocationOperation start start 方法 会在当前线程执行 @selector 方法 - (void)opDemo

ios开发- NSOperation高级功能

直接上代码 示例1: @interface TBViewController() //队列 @property(nonatomic,strong)NSOperationQueue *queue; @end //队列的暂停和继续(在storyboard中拖两个按钮,分别为暂停.继续,连线) //暂停 -(IBAction)pause { if(self.queue.operationCount == 0){ NSLog(@"无操作"): return: } //挂起>暂停  暂停的

【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

转自容芳志的博客 简介 iOS有三种多线程编程的技术,分别是: (一)NSThread (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 三种方式的优缺点介绍: 1)NSThread: 优点:NSThread 比其他两个轻量级 缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 NSThread实现的技术

iOS 多线程开发之OperationQueue(二)NSOperation VS GCD

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言:最近有点忙,所以这个月更新的博客数量有些下降,估计这个月和下个月博客更新的数量都在10篇左右.回到正题,本文会比较下GCD和NSOperation两种多线程的实现方式.然后讲解下如何选择,以及简单的示例. 选择GCD or NSOperationQueue

iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的. 三种方式的优缺点介绍:1)NSThread:优点:NSThread 比其他两个轻量级缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 NSThread实现的技术有下面三种:一般使用cocoa