「OC」多线程(三)——NSOperation

【多线程-第二天-NSBlockOperation的基本使用 Objective-C语言】 阅读详情

「OC」多线程(三)——NSOperation

前言

在写了知乎日报之前学习了相关的GCD和NSThread的相关内容,然后在知乎日报写完之后,我继续开始OC之中多线程的NSOperation的学习。由于之后肯定是要对AFNetworking和SDWebImage的源码继续相关学习,所以学习NSOperation的相关内容也是给后面做铺垫。

介绍

NSOperation 是苹果公司对 GCD 的封装,完全面向对象,并比GCD多了一些更简单实用的功能,所以使用起来更加方便易于理解。NSOperation 和NSOperationQueue 分别对应 GCD 的 任务 和 队列。

首先我们来看看,关于GPT给出的GCD和NSOperation的区别

特性NSOperationGCD
抽象级别面向对象,高抽象基于 C 语言,低抽象
任务依赖支持,任务之间可设置依赖关系不支持,需要手动控制
取消任务支持任务取消并可检测取消状态不支持(任务一旦开始,无法取消)
任务管理可管理任务状态(开始、取消、完成等)无任务状态管理
队列控制最大并发数、优先级、依赖性控制较少,需手动实现

实现的具体步骤

  1. 将需要执行的操作封装到一个NSOperation对象中

  2. 将NSOperation对象添加到NSOperationQueue中系统会自动将NSOperationQueue中的NSOperation取出来,并将取出的NSOperation封装的操作放到一条新线程中执行

NSOperation的创建

NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类——使用NSOperation子类的方式有3种

  1. NSInvocationOperation
    /*
     第一个参数:目标对象
     第二个参数:选择器,要调用的方法
     第三个参数:方法要传递的参数
     */
NSInvocationOperation *op  = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil];
//启动操作
[op start];
  1. NSBlockOperation(最常用)
//1.封装操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
       //要执行的操作,在主线程中执行
       NSLog(@"1------%@",[NSThread currentThread]); 
}];
//2.追加操作,追加的操作在子线程中执行,可以追加多条操作
[op addExecutionBlock:^{
        NSLog(@"---download2--%@",[NSThread currentThread]);
    }];
[op start];
  1. 自定义子类继承NSOperation,实现内部相应的方法
// 重写自定义类的main方法实现封装操作
-(void)main
{
    // 要执行的操作
}
// 实例化一个自定义对象,并执行操作
JCOperation *op = [[JCOperation alloc]init];
[op start];

自定义类封装性高,复用性高。

NSOperationQueue的使用

NSOperation中的两种队列

  • 主队列:通过mainQueue获得,凡是放到主队列中的任务都将在主线程执行
  • 非主队列:直接alloc init出来的队列。非主队列同时具备了并发和串行的功能,通过设置最大并发数属性来控制任务是并发执行还是串行执行
// 主队列获取方法
NSOperationQueue *queue = [NSOperationQueue mainQueue];
// 自定义队列创建方法
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSOperationQueue的作用

  • NSOperation可以调用start方法来执行任务,但默认是同步执行的
  • 如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作

添加操作到NSOperationQueue中

- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;

注意:将操作添加到NSOperationQueue中,就会自动启动,不需要再自己启动了,addOperation 内部调用 start方法 ,而start方法内部调用 main方法

使用实例

了解了以上相关的原理,接下来学习几个例子进行巩固

NSInvocationOperation的使用

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(taskMethod) object:nil];
[operation start]; // 直接启动任务

- (void)taskMethod {
    NSLog(@"任务执行中 - %@", [NSThread currentThread]);
}

这样的操作,默认任务是要在当前主线程之中完成的,如果我们想要实现异步操作的话,就需要和NSOperationQueue配合进行使用,不过这样一来代码就会较为的冗余,因此在实际运用之中我们不太使用。

NSBlockOperation的使用

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"任务1 - %@", [NSThread currentThread]);
}];

// 添加额外任务
[operation addExecutionBlock:^{
    NSLog(@"任务2 - %@", [NSThread currentThread]);
}];

[operation start];

任务的主块和附加块可能并发执行。而且,主任务是在主线程之中执行,而额外的任务则是在子线程之中执行

image-20241125201345447

NSOperationQueue的使用

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

// 创建任务
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"任务1 - %@", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"任务2 - %@", [NSThread currentThread]);
}];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"任务3 - %@", [NSThread currentThread]);
}];

// 将任务加入队列
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];


  • 队列会自动创建多个线程并发执行任务。

  • 默认并发执行任务,可以通过设置maxConcurrentOperationCount调整并发数。

image-20241125201658428

取消操作

我们在任务进行的时候通过调用cancel的方法对任务进行取消,不过值得注意的是,当我们取消任务的时候,任务并不会自动停止,而是需要我们通过调用任务的isCancelled的方法进行判断,我们用一个简单的例子实现方式如下

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    for (int i = 0; i < 5; i++) {
        if ([operation isCancelled]) {
            NSLog(@"任务被取消");
            return;
        }
        NSLog(@"任务执行中:%d", i);
        [NSThread sleepForTimeInterval:1]; // 模拟耗时任务
    }
    NSLog(@"任务完成");
}];

[queue addOperation:operation];

// 2秒后取消任务
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [operation cancel];
});

image-20241125205311226

我们可以将if ([operation isCancelled]) 的内容注释,这时候我们可以发现,任务会直接执行完整,而不是到任务2的时候就中断了。

最大并发数

前面我们说到了,NSOperationQueue之中每添加一个任务,都会将任务添加到一个子线程之中,那如果不想要让这个队列开这么多个并发的线程,我们就可以设置这个队列之中的属性maxConcurrentOperationCount

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 2; // 最多并发2个任务

for (int i = 0; i < 5; i++) {
    [queue addOperationWithBlock:^{
        NSLog(@"任务%d - %@", i, [NSThread currentThread]);
        [NSThread sleepForTimeInterval:1]; // 模拟耗时任务
    }];
}

image-20241125214528178

自定义NSOperation子类

当内置的 NSBlockOperation 和 NSInvocationOperation 无法满足需求时,可以继承 NSOperation 自定义复杂任务。

相关属性和方法

// 对于并发的Operation需要重写改方法
- (void)start;

// 非并发的Operation需要重写该方法
- (void)main;

// 任务是否取消(只读) 自定义子类,需重写该属性
@property (readonly, getter=isCancelled) BOOL cancelled;

// 可取消操作,实质是标记 isCancelled 状态,自定义子类,需利用该方法标记取消状态
- (void)cancel;

// 任务是否正在执行(只读),自定义子类,需重写该属性
@property (readonly, getter=isExecuting) BOOL executing;

// 任务是否结束(只读),自定义子类,需重写该属性
// 如果为YES,则队列会将任务移除队列
@property (readonly, getter=isFinished) BOOL finished;

// 判断任务是否为并发(只读),默认返回NO
// 自定义子类,需重写getter方法,并返回YES
@property (readonly, getter=isAsynchronous) BOOL asynchronous;

// 任务是否准备就绪(只读)
// 对于加入队列的任务来说,ready为YES,则表示该任务即将开始执行
// 如果存在依赖关系的任务没有执行完,则ready为NO
@property (readonly, getter=isReady) BOOL ready;

对于NSOperation.如果要自定义的话,我们需要重写start或者main,这两个方法的其中之一,自定义的是并发的NSOperation.那么我们得重写start方法.如果是非并发的话就只需要将相关逻辑写在main方法之中。接下来我们介绍一下相关的main和start方法的区别

start方法

start 方法是 NSOperation 的入口点,表示任务开始执行。

当调用 start 方法时,NSOperation 会根据其内部状态决定如何执行任务:

  • 如果操作已被取消(即 isCancelled == YES),它会直接标记为完成,而不会执行。
  • 如果未被取消:
    • 在主线程中调用 main 方法(默认情况下)。
    • 如果操作是异步的(需要自定义实现),start 方法通常会启动一个异步任务

默认的start方法逻辑大致如下

- (void)start {
    if (self.isCancelled) {
        [self finish];
        return;
    }

    [self setIsExecuting:YES];
    [self main];
    [self setIsExecuting:NO];
    [self finish];
}

main方法

main 是任务的实际执行内容。

默认情况下,NSOperation 的 main 方法是空的。开发者需要通过子类化 NSOperation 并重写 main 方法来定义任务的具体逻辑。

main 方法在调用 start 时被执行。一般来说main就是用来完成任务的具体逻辑,但一般来说,如果只是为了串行的完成相关任务,其实代码不需要放置在main方法之中,相关处理放在可见的控制器之中即可

重写NSOperation实现并发

了解了相关的方法和属性之后,其实如何让NSOperation实现并发其实也不算太难

@interface JCOperation : NSOperation
@end

@implementation JCOperation {
    BOOL _isExecuting;
    BOOL _isFinished;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        _isExecuting = NO;
        _isFinished = NO;
    }
    return self;
}

- (void)start {
    if (self.isCancelled) {
        [self finish];
        return;
    }

    [self setIsExecuting:YES];

    // 异步操作开始
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self main];
    });
}

- (void)main {
    // 模拟异步任务(网络请求等)
    [NSThread sleepForTimeInterval:2];
    NSLog(@"任务完成 - %@", [NSThread currentThread]);

    [self finish];
}

- (void)finish {
    [self setIsExecuting:NO];
    [self setIsFinished:YES];
}

// 重写状态方法,getter方法
- (BOOL)isExecuting { return _isExecuting; }
- (BOOL)isFinished { return _isFinished; }

- (void)setIsExecuting:(BOOL)isExecuting {
  //手动触发KVO
    [self willChangeValueForKey:@"isExecuting"];
    _isExecuting = isExecuting;
    [self didChangeValueForKey:@"isExecuting"];
}

- (void)setIsFinished:(BOOL)isFinished {
    [self willChangeValueForKey:@"isFinished"];
    _isFinished = isFinished;
    [self didChangeValueForKey:@"isFinished"];
}
@end

在重写NSOperation子类当中,我们需要使用KVO来实现对应属性的改变,由于KVO 机制只能监听 属性,也就是类提供的 @property 定义的公开或受保护的接口。而在NSOperation之中其 isExecuting 和 isFinished 属性是只读的,我们无法直接使用 self.executing = YES; 来修改其值。

  • 当我们自定义 NSOperation 子类时,_isExecuting 和 _isFinished 这两个实例变量代替了原有的只读属性 isExecuting 和 isFinished。
  • 在内部逻辑中,我们直接操作这些实例变量来控制操作的状态。
  • 实际使用中,NSOperationQueue 或其他部分不直接访问这些变量,而是通过 isExecuting 和 isFinished 的 getter 方法获取状态。(这个很关键)

KVO的关键就在于通知其他部分属性的变化,通过 KVO,我们在修改实例变量时,将变化广播给 NSOperationQueue 等外部监听方:

  1. NSOperationQueue 使用 KVO 监听 isExecuting 和 isFinished 的变化。
  2. 当 isFinished 变为 YES 时,队列会认为操作已完成并从队列中移除,同时触发依赖任务的执行。

由于KVO 的工作原理要求使用完整的 getter 方法名称作为键路径,而不是属性名本身。所以我们使用KVO手动监听isExecuting 和 isFinished

@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;

简单的概括来说是:

实例变量是内部逻辑的真实值。

KVO 是广播机制,通知外部(尤其是 NSOperationQueue)状态已经改变。

参考文章

NSOperation

彻底了解NSOperation的自定义

iOS Operation 自定义的注意点

OC底层探索(十九) 多线程 1.进程与线程 1.1 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 目前在iOS中,一个进程就是一个app。 1.2 线程 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行. 进程要想执行任务,必须得有线程,进程至少要有一条线程 程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程 1.3 进程与线程的关系 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。 资源拥有:同一进程内的线 阅读详情

相关推荐

iOS多线程——你要知道的NSOperation都在这里

你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里转载请注明出处 http://www.jianshu.com/p/bf0916ee1492本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不

什么都不会的小菜鸟 3775

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

本文用来介绍 iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。通过本文,您将了解到:NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperation 操作依赖和优先级、线程间的通信、线程同步和线程安全,以及 NSOperation、NSOperationQueue ...

欢迎来到一度's博客 496

Objective-C多线程详解(NSThread、NSOperation、GCD)

进程和线程 程序:一个由源代码生成的可执行应用(比如qq,微信…) 进程:进程是指在系统中正在运行的一个应用程序。一个正在运行的程序可以看成一个进程,进程负责去向手机系统申请资源,同时将这些资源调度给我们的线程线程:1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程),可以看成是可以运行的代码段,这些代码段需要的资源,比如内存,都需要去向进程申请。线程是进 程的基本执行单元

EverStar's Blog 4909

NSOperation的进阶使用和简单探讨

NSOperation类是iOS2.0推出的,通过NSThread实现的,但是效率一般。从OS X10.6和iOS4推出GCD时,又重写了NSOperation和NSOperationQueue,NSOperation和NSOperationQueue分别对应GCD的任务和队列,所以NSOPeration和NSOperationQueue是基于GCD更高一层的封装,而且完全地面向对象。但是比GCD更简单易用、代码可读性也更高。

GJ_ia的博客 533

自定义NSOperation

前言 如果系统提供的NSInvocationOperation和NSBlockOperation对象不能满足自身需求, 我们可以自定义NSOperation, 来实现特定的功能。 需要知道的是NSOperation 是一个抽象类,所以我们不能直接使用该类来创建实例。 通常的做法是继承NSOperation,并重写里面的方法。 要重写哪些方法,这要取决于你要实现的是非并发还是并发的NSOperation。 定义同步的NSOperation要简单许多,只需要重载main这个方法,在这个方法里面执行主任务,并

Rey的技术博客 554

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(中)

介绍了三相电机控制中的SVPWM算法实现及保护机制设计。SVPWM部分详细解析了电压矢量扇区判断、占空比计算和过调制保护,通过限制占空比范围(0-100%)防止电机失控,并提供了完整的代码实现。保护模块则重点分析了过流、过压/欠压、过温三种保护机制,采用分级处理策略(硬保护停机/软保护降功率)确保系统安全。此外,文章还介绍了参数管理模块在STM32 Flash中的存储方案,包括参数定义、数据结构和读写操作,为电机控制系统提供了完整的解决方案。

bother3000的博客 1387

OC中多线程执行顺序的控制

OC中多线程主要使用的GCD和NSOperation和NSOperationQueue GCD时基于C语音开发的一套多线程开发机制,时完全面向过程的。GCD统一管理整个队列中的任务。GCD队列分为并行队列和串行队列。 串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。 并发队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。 NSOp

kobeWei 5566

【蓝桥杯——单片机学习笔记】十三.点阵(STC15F2K60S2)

一.点阵内部图 点阵的有两种,分为共阴和共阳(与数码管类似,后续代码根据共阳点阵编写)。点阵的控制主要是每行和每列电平的控制。如图,以共阳为例:若要使左上角的灯亮,则第一行输出高电平(其他行均为低电平),第一列输出低电平(其他列均为高电平)。 二.原理图 与数码管共用接口,所以数码管和点阵的显示只能选一个使用! 原理图中点阵的接口R5即代表第5行(Row),C8即代表第8列(Column)。通...

默默无闻小菜鸡的博客 2010

OC 多线程:NSThread,GCD,NSOperation

OC 多线程:NSThread,GCD,NSOperation OC 常用的多线程实现方法有: NSThread GCD NSOperation 下面逐一总结一下。 NSThread NSThread是官方提供的,面向对象的创建多线程的方法。 NSThread可以随时查看当前代码所在的线程。比如: NSLog(@"%@", [NSThread currentThread]); // <NSThread: 0x6000007f0000>{number = 1, name = main} NS

BoilerUp的博客 515

从打印攻击到视频重放:手把手用OULU-NPU训练你的第一个活体检测模型

本文详细介绍了如何使用OULU-NPU数据集训练活体检测模型,以应对打印攻击和视频重放等安全威胁。通过PyTorch框架,从环境准备、数据加载、预处理到模型架构设计,手把手教你构建一个高效的双流网络,结合CNN和LSTM技术,提升模型在多种攻击场景下的检测准确率。

weixin_29092031的博客 383

图像特征(一)——颜色特征(颜色直方图,颜色矩,颜色集,颜色聚合向量和颜色相关图)

本文主要是为了更好地理解图像特征,理解各方法的原理。转载请注明出处https://mp.youkuaiyun.com/console/editor/html/105090183 图像模式识别的一般步骤为:输入图像--图像预处理--特征提取--特征选择--图像分类--输出结果。 图像特征主要有:颜色特征、形状特征、纹理特征和空间关系特征。 本文主要介绍颜色特征,并给出matlab上实现的demo。 颜...

gloria_iris的博客 3万+

OC之多线程

事情太忙碌,直接用OC记录了,以后使用时,再换成Swift 多线程 1、NSThread -》最基本的创建方式 /** 创建线程第一种方法,需要调用start方法才可以执行 */ NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:

Francis-ChinaFeng 1493

多目标进化算法——NSGA-II(python实现)

NSGA-II(python实现)--最全注释,痴呆能懂--

no___good的博客 5278

多线程实现之GCD、NSThred、NSOperation

在iOS中实现多线程技术的方法:pthread、NSThread、GCD、NSOperation 多线程的实质就是开辟新的线程、添加队列、在队列中添加同步任务或者异步任务 一、pthread是一套通用的C语言的多线程API,适用于Unix,Linux,Windows等系统,可跨平台,使用难度大,几乎不用 二、NSThread: 是OC的线程对象,一个NSThread对象就是一条线程;  ...

ningn111的博客 868

25、压电泵致动器变形计算与测量及转弯腔射流特性的有限元分析

本文围绕压电泵致动器的变形计算与测量以及转弯腔射流特性的有限元分析展开研究。通过建立有限元模型和抛物线拟合方法,对压电泵致动器的位移和变形体积进行了详细计算,并探讨了其对传感器性能的影响。同时,利用ANSYS软件对转弯腔在不同角速率输入下的射流特性进行了仿真分析,揭示了流场分布随角速率变化的规律。研究成果为压电流体角速率传感器的设计优化提供了理论依据和技术支持。

ooo22的博客 125

双馈风机并网系统宽频振荡机理与抑制方法研究

双馈风机并网系统宽频振荡分析与抑制 摘要:本文研究了双馈风机(DFIG)接入弱电网引发的宽频振荡问题。通过建立DFIG并网系统阻抗模型,分析了锁相环带宽、电流环带宽等参数对阻抗特性的影响。研究揭示了DFIG与电网阻抗交互导致交截频率处相位差超过180°的振荡机理。提出基于锁相环优化的阻抗重塑抑制策略,采用电压补偿和陷波器改善系统稳定性。仿真结果表明,该方法能有效降低相位差约10°-168°,显著抑制宽频振荡。代码实现了阻抗建模、稳定性分析和抑制策略验证,为工程应用提供了理论依据。

huanghm88的专栏 318

iOS多线程之NSOperation与NSOperationQueue的使用

NSOperation是常见的多线程方案,是对GCD的封装,采用OC方法,更加面向对象。NSOperation的使用:配合使用NSOperation(任务)和NSOperationQueue(队列)也可以实现多线程。 1、将需要执行的操作封装到一个NSOperation对象中 2、然后将NSOperation对象添加到NSOperationQueue中 3、系统自动将NSOperationQu

Rephontil的博客 3342

Python爬虫:实时交通流量数据爬取与路况分析

随着城市化进程的不断推进,交通流量的管理与预测已成为智能交通系统的重要研究方向。交通流量数据不仅为城市交通管理提供了科学依据,还为驾驶员提供了实时路况信息,帮助其做出更加合理的出行决策。通过爬虫技术,我们可以实时获取城市的交通流量数据,从而分析路况,优化交通管理。在这篇博客中,我们将介绍如何使用Python编写一个爬虫来爬取实时交通流量数据,分析道路的交通状况。我们将使用最新的技术工具来构建爬虫,包括。

2201_76125261的博客 1267

多线程之NSOperation的简单使用

和多线程相关的基础知识,总共只有四个:pthread、NSThread、GCD和NSOperation。在前面,我们已经整理完了3个,现在就剩下NSOperation这一个了,下面,我们就继续学习这最后一个。 一、NSOpertion的基本使用     NSOperation是一个抽象类,它本身并不具备封装操作的能力,必须使用它的子类。这一点和我们之前学过的UIGestureRecognizer类

Enrica_Shi的博客 625

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅析iOS多线程编程之NSOperation

前言 和NSThread、GCD一样,NSOperation也是Apple提供的一项多线程并发编程方案。和GCD不同的是,NSOperation是对GCD在OC层面的封装,NSOperation完全面向对象。默认情况下,NSOperation并不具备封装操作的能力,NSOperation是一...

chuange6363的博客 374

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【OC】IOS多线程之NSoperation和GCD的比较

GCD是基于c的底层api,NSOperation属于object-c类。ios 首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现的。 相对于GCD: 1,NSOperation拥有更多的函数可用,具体查看api。 2,在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。 3,有kvo

省 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

多线程(三) NSOperation,NSOperationqueue

/*------------------------------  NSOperation使用 1.简介  -----------------------------------*/ 重点:理解操作 NSOperation 和操作队列 NSOperationQueue! 操作队列 NSOperationQueue :1> 决定操作在哪条线程执行 2>管理操作(暂停/恢复 取消) 3>

M_SR_的博客 512

多线程之NSOperation

NSOperation NSOperation/NSOperationQueue 配合使用费,开启线程! OC 的框 基于 GCD ! 更加面向对象(oc),但GCD效率更高! NSOperation : 封装了 GCD 中的"任务"! NSOperationQueue : 封装了 GCD 中的"队列"! NSOperation的作用

u013370845的博客 228

[iOS开发]NSOperation、NSOperationQueue

文章目录简介概念了解基本使用创建操作使用子类NSInvocationOperation(Invocation:调用)使用子类NSBlockOperation使用自定义继承自NSOperation的子类重写main方法重写start方法创建队列将操作加入到队列中NSOperationQueue控制串行、并发NSOperation操作依赖NSOperation优先级NSOperation、NSOperationQueue线程间的通讯线程安全常用属性和方法NSOperationNSOperationQueue 简

复杂化的博客 924

NSOperation - 01

NSOperation 在介绍NSOperation之前,我们来看看IOS中多线程的实现方案有哪些?都有什么特点? 1,pthread  基于C语言,线程的生命周期是由程序员管理的; (1)一套通用的多线程API (2)适用于Unix\Linux\Windows (3)跨平台、可移植 (4)使用难度大 2,NSThread  基于OC语言,线程生命周期也是

Hepburn_的博客 1416

【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结

OC中的多线程OC中多线程根据封装程度可以分为三个层次:NSThread、GCD和NSOperation,另外由于OC兼容C语言,因此仍然可以使用C语言的POSIX接口来实现多线程,只需引入相应的头文件:#include <pthread.h>。NSThreadNSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期、线程同步和线程加锁等,开销较大;NSThread的基本使用

Mr_厚厚的博客 7380
上一篇: 「OC」知乎日报——第三周
下一篇: 「OC」GCD的相关练习
小鹿撞出了脑震荡
博客等级 码龄3年 1107粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值