NSInvocationOperation

The NSInvocationOperationclass is a concrete subclass of NSOperationthat you use to initiate an operation that consists of invoking a selector on a specified object. This class implements a non-concurrent operation.
根据苹果官方的解释说,NSInvocationOperationNSOperation一个子类,你可以初始化一个操作,该操作在一个指定的对象上去调用一个selector,并且NSOperation这个类实现了一个非并发的操作。具体怎么使用NSInvocationOperation这个类呢?

NSInvocationOperation的创建

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

NSInvocationOperation创建完成之后,怎么触发该线程的执行?一共有两种方式执行该线程
方式一:

//调用start方法执行,此执行方式在主线程中执行,没有开辟新的线程
// ThreadDemo[20397:12090175] ------------<NSThread: 0x60400007da00>{number = 1, name = main}-----
[operation start];

调用start方法执行此线程,但是使用此方法,并不会开辟新的线程来执行代码
方式二:

    //加入到队列中去执行,此种方式会开辟线程,在新的线程中执行代码
// ThreadDemo[20432:12091400] ------------<NSThread: 0x600000273240>{number = 3, name = (null)}-----
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];

根据打印信息可以看出,把创建的NSInvocationOperation加入到一个queue队列中去执行,会开辟新的线程执行任务。

NSBlockOperation

The NSBlockOperationclass is a concrete subclass of NSOperationthat manages the concurrent execution of one or more blocks. You can use this object to execute several blocks at once without having to create separate operation objects for each. When executing more than one block, the operation itself is considered finished only when all blocks have finished executing.
NSBlockOperation类是NSOperation的一个具体子类,它管理一个或多个块的并发执行。您可以使用这个对象一次执行几个块,而不必为每个块创建单独的操作对象。当执行多个块时,只有当所有块都完成执行时,才考虑操作本身。

NSBlockOperation的创建

 //创建NSBlockOperation线程方式1
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"------operation------%@-----", [NSThread currentThread]);
}];
[operation start];
//创建NSBlockOperation线程方式2
NSBlockOperation *operation1 = [[NSBlockOperation alloc] init];
[operation1 addExecutionBlock:^{
NSLog(@"------operation1------%@-----", [NSThread currentThread]);
}];
[operation1 start];

这样创建后调用start方法,同样在主线程中执行,下面看看把NSBlockOperation添加到queue队列中去执行

    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
[operation addExecutionBlock:^{
NSLog(@"------block1------%@-----", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"------block2------%@-----", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"------block3------%@-----", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"------block4------%@-----", [NSThread currentThread]);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];

可以看出,加入到queue队列中的任务全都是异步执行

使用NSOperationQueue来创建任务

/**
使用queue队列来自己添加任务并执行
*/
- (void)testOperationQueue {
//创建queue队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//添加任务
[queue addOperationWithBlock:^{
NSLog(@"------block1------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block2------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block3------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block4------%@-----", [NSThread currentThread]);
}];
}

可以看出,使用queue队列来创建任务,省去了创建NSInvocationOperationNSBlockOperation再加入到队列中执行。
上面列出了三种实现NSOperation创建多线程的方式,在具体的工作中,使用哪种方式还是要根据工作需要具体对待。

队列的使用----依赖执行任务

有这个一个场景:任务3的执行依赖于任务2,任务2的执行依赖于任务1,相当于一个串行队列,只有当前面一个执行完成之后才开始下一个任务的执行,下面看看具体的实现方式:

/**
使用场景一:任务的依赖执行
*/
- (void)testDepenceyOperation {
//创建要执行的任务
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"------operation1------%@-----", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"------operation2------%@-----", [NSThread currentThread]);
}];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"------operation3------%@-----", [NSThread currentThread]);
}];
//给任务添加依赖,任务3依赖任务2,任务2依赖任务1
[operation3 addDependency:operation2];
[operation2 addDependency:operation1]; NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
}

队列的使用---设置最大并发数

设置最大并发数量,为了保证app的整个生命周期不会占用过多的资源,在有大量并发线程执行的时候,一定要进行设置,不然可能会造成app闪退。

- (void)testMacConcurrentOperationCount {
//创建queue队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//设置线程的最大并发数量
queue.maxConcurrentOperationCount = 3;
//添加任务
[queue addOperationWithBlock:^{
NSLog(@"------block1------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block2------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block3------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block4------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block5------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block6------%@-----", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
NSLog(@"------block7------%@-----", [NSThread currentThread]);
}];
}

iOS开发多线程之NSOperation的更多相关文章

  1. iOS开发-多线程之GCD(Grand Central Dispatch)

    Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过 ...

  2. iOS开发多线程之NSThread

    一.NSThread的属性与方法 1.NSThread 类方法 类方法,顾名思义通过类名直接调用的方法 1. + (void)detachNewThreadWithBlock:(void (^)(vo ...

  3. iOS开发多线程之GCD

    Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Dispatch Que ...

  4. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  5. 多线程之NSOperation

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

  6. iOS多线程之NSOperation详解

    使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOpe ...

  7. iOS开发之多线程技术——NSOperation篇

    本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation ...

  8. 多线程之NSOperation简介

    在iOS开发中,为了提升用户体验,我们通常会将操作耗时的操作放在主线程之外的线程进行处理.对于正常的简单操作,我们更多的是选择代码更少的GCD,让我们专注于自己的业务逻辑开发.NSOperation在 ...

  9. 记Booking.com iOS开发岗位线上笔试

    今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为 ...

随机推荐

  1. 洛谷P3957 跳房子(Noip2017普及组 T4)

    今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...

  2. JDBC工具类完整版!

    package com.aaa.util; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; impor ...

  3. 深入理解JVM(4)——对象的创建和访问

    1.对象的创建 在语言层面上,创建对象(例如克隆,反序列化)通常仅仅是一个new关键字而已. 在虚拟机中,对象(文中讨论的对象限于普通 Java 对象,不包括数组和 Class 对象等)的创建过程如下 ...

  4. os.listdir()、os.walk()和os.mkdir()的用法

    内容主要参照博客https://blog.csdn.net/xxn_723911/article/details/78795033 http://www.runoob.com/python/os-wa ...

  5. Docker的可视化管理工具对比

    Docker的可视化管理工具有DockerUI.Shipyard.Rancher.Portainer等等,这里主要对这几个进行优劣对比. DockerUI: 优点   (1)支持container批量 ...

  6. 机器学习之正则化【L1 & L2】

    前言 L1.L2在机器学习方向有两种含义:一是L1范数.L2范数的损失函数,二是L1.L2正则化 L1范数.L2范数损失函数 L1范数损失函数: L2范数损失函数: L1.L2分别对应损失函数中的绝对 ...

  7. 主机管理+堡垒机系统开发:strace工具的实现原理(七)

    strace是Linux系统下的一个用来跟踪系统调用的工具,它的实现基础是ptrace系统调用.使用strace工具可以跟踪一个程序执行过程中发生的系统调用. 我这里讲到的内容有一点点和mips体系相 ...

  8. BeautifulSoup解析模块

    简介: Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. 使用 from bs4 impor ...

  9. ArcGis恢复初始设置(默认设置、出厂设置)的方法

    警告:下面的操作涉及更改操作系统的重要组成部分.必要时,请咨询计算机系统专业人士. 重命名 ESRI 文件夹即对 ArcGIS 恢复出厂设置,因此必须重新安装当前安装的所有第三方工具.自定义脚本和自定 ...

  10. 小程序图片转Base64

    在小程序中,有些业务要用到 图片的 base64 wx.chooseImage({ success: res => { wx.getFileSystemManager().readFile({ ...