项目中使用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. bzoj4409&&bzoj4410&&bzoj4411[Usaco2016 Feb Platinum]题解

    辣鸡wyz最近状态奇差,于是想用usaco题找找手感,万万没想到被虐了一脸TAT 先贴代码,有空再填坑 4409[Usaco2016 Feb]Circular barn #include <io ...

  2. 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash

    4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 20  Solved: 11[Submi ...

  3. Handlers

    示例: - name: Configure webserver with nginx and tls hosts: webservers sudo: True vars: conf_file: /et ...

  4. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

  5. Objective-C 中基于RunTime实现的反射

    一.反射 反射,一般表现在字符串和Class转换,字符串和内部方法转换,字符串和属性的转换(取值和赋值). 二.Objective-C中的反射 OC的反射是基于其Runtime实现的. 以执行某个函数 ...

  6. git命令笔记2

    . # 忽略所有后缀为.a的文件 *.a # 不忽略lib.a(相对于上面的) !lib.a # 只忽略根下的TODO,不递归到子目录 /TODO # 忽略所有build/下的文件 build/ # ...

  7. Algorithmic Graph Drawing in TikZ

    最近在写模板时需要画个图 ("图论"的"图"). 本来打算用Windows画图 (mspaint) 的, 但是效果不好, 还是决定用LaTeX的TikZ画. 这 ...

  8. POJ 2492 A Bug's Life

    传送门:A Bug's Life Description Background Professor Hopper is researching the sexual behavior of a rar ...

  9. Linux下安装webstorm

    Linux下安装webstorm 1--在webstorm官网里面下载最新的版本 WebStorm-11.0.3.tar.gz 2--创建webstorm的安装目录 #mkdir /usr/webst ...

  10. java连接数据源-读取tomcat数据源配置

    读取数据源配置,获取连接 1.配置数据源 D:\apache-tomcat-7.0.70\conf\context.xml <Resource name="jdbc/news" ...