项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

 NSOperation 与 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不好做)

继续/暂停/全部取消

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

全局队列

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

@property (nonatomic, strong) NSOperationQueue *queue;

- (NSOperationQueue *)queue {

    if (_queue == nil) {

        _queue = [[NSOperationQueue alloc] init];

    }

    return _queue;}

最大并发操作数

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

- (void)opDemo1 {

     // 设置同时并发操作数

    self.queue.maxConcurrentOperationCount = ;

    NSLog(@"start");

    for (int i = ; i < ; ++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 == ) {

        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 == ) { NSLog(@"没有操作"); return; } // 取消对列中的所有操作,同样不会影响到正在执行中的操作! [self.queue cancelAllOperations]; NSLog(@"取消全部操作 %tu", self.queue.operationCount); } 取消队列中所有的操作 不会取消正在执行中的操作 不会影响队列的挂起状态 依赖关系 /// 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"); }

NSOperation GCD 对比 (附NSOperation演练)的更多相关文章

  1. 多线程之pthread, NSThread, NSOperation, GCD

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD p ...

  2. iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  3. iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 -- 转

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  4. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  5. iOS多线程开发--NSThread NSOperation GCD

    多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...

  6. NSThread/NSOperation/GCD 三种多线程技术

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  7. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  8. 多线程技术 NSThread & NSOperation & GCD

    多线程:在iOS开发中,用到多线程的处理问题的时候有很多,比如异步下载数据时刷新界面等等. 引入多线程来处理问题的关键就是,基于多线程可以使界面更加流畅,防止界面假死. 界面假死:比如你单击一个按钮来 ...

  9. 多线程&NSObject&NSThread&NSOperation&GCD

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...

随机推荐

  1. Hive 按某列的部分排序 以及 删列操作

    脑袋果然还是智商不足. 涉及到的小需求: 某个表test 有一列 tc: a字符串+b字符串+c字符串 拼接组成 把test表,按b字符串排序 输出 遇到的问题: select 里面必须包含 orde ...

  2. python 学习笔记7(类/对象的属性;特性,__getattr__)

    27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...

  3. 77.Android之代码混淆

    转载:http://www.jianshu.com/p/7436a1a32891 简介 作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使 ...

  4. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  5. FIneCMS /dayrui/libraries/Chart/ofc_upload_image.php Arbitrary File Upload Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Relevant Link: http://www.wooyun.org ...

  6. Sql Server日期查询-SQL查询今天、昨天、7天内、30天

    今天的所有数据: 昨天的所有数据: 7天内的所有数据: 30天内的所有数据: 本月的所有数据: 本年的所有数据: 查询今天是今年的第几天: select datepart(dayofyear,getD ...

  7. 导入.pch文件

    Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会 ...

  8. Java反射API使用实例

    /**     * 访问Class对应的类所包含的注释:getAnnotation();getDelaredAnnotation();     * 访问Class对应的类所包含的内部类:getDecl ...

  9. Android应用程序消息处理机制

    http://download.csdn.net/detail/luoshengyang/6439647 pdf

  10. iOS - 装饰对象

    1.设计模式原则 多组合,少继承 类对拓展开放,对修改关闭 派生的子类接口是在编译时就静态决定的,而所有子类都会继承到相同的接口.然而,利用组合或者说装饰模式来拓展抽象类的接口,就可以在运行时动态的进 ...