NSOperationQueue

《C/C++等级考试(1~8级)历届真题解析》专栏总目录 中国电子学会《全国青少年软件编程等级考试》C/C++编程(1~8级)历届真题解析。订阅后可阅读专栏内所有真题解析,真题持续更新中! 阅读详情

001两种队列形式:主队列,自定义队列。添加到主队列的NSOperation会放在主线程中执行,放在自定义队列的NSOperation,默认放在子线程并发执行。

002 向NSOperationQueue添加操作

代码实例:

- (void)testAddFunction{
    
    NSOperationQueue *mainQueue = [NSOperationQueue currentQueue];
    
    NSOperationQueue  *theQueue = [[NSOperationQueue alloc] init];
    
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op1");
    }];
    
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op2");
    }];
    
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op3");
    }];
    
    NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op4");
    }];
    
    NSBlockOperation *op5 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"op5");
    }];
    
    
    [mainQueue addOperation:op1];
    
    [mainQueue addOperations:@[op2,op4,op3,op5] waitUntilFinished:NO];
    
    [mainQueue  addOperationWithBlock:^{
        NSLog(@"addOperationWithBlock");
    }];
    
    
    
}

2020-11-01 10:30:59.576579+0800 GCDPropertyQueue[5216:477013] op1

2020-11-01 10:30:59.577015+0800 GCDPropertyQueue[5216:477013] op2

2020-11-01 10:30:59.579641+0800 GCDPropertyQueue[5216:477013] op4

2020-11-01 10:30:59.580128+0800 GCDPropertyQueue[5216:477013] op3

2020-11-01 10:30:59.580325+0800 GCDPropertyQueue[5216:477013] op5

2020-11-01 10:30:59.580565+0800 GCDPropertyQueue[5216:477013] addOperationWithBlock

 

003 如果NSOperationQueue添加了之前添加的操作那就会闪退

[mainQueue addOperation:op1];

 [mainQueue addOperation:op1];

[mainQueue addOperation:op1];

    [mainQueue addOperations:@[op2,op4,op3,op5,op1] waitUntilFinished:NO];

上源码:

- (void) addOperation: (NSOperation *)op

{

  if (op == nil || NO == [op isKindOfClass: [NSOperation class]])

    {

      [NSException raise: NSInvalidArgumentException

  format: @"[%@-%@] object is not an NSOperation",

NSStringFromClass([self class]), NSStringFromSelector(_cmd)];

    }

  [internal->lock lock];

  if (NSNotFound == [internal->operations indexOfObjectIdenticalTo: op]

    && NO == [op isFinished])

    {

      [op addObserver: self

  forKeyPath: @"isReady"

      options: NSKeyValueObservingOptionNew

      context: isReadyCtxt];

      [self willChangeValueForKey: @"operations"];

      [self willChangeValueForKey: @"operationCount"];

      [internal->operations addObject: op];

      [self didChangeValueForKey: @"operationCount"];

      [self didChangeValueForKey: @"operations"];

      if (YES == [op isReady])

{

  [self observeValueForKeyPath: @"isReady"

      ofObject: op

change: nil

      context: isReadyCtxt];

}

    }

  [internal->lock unlock];

}

 

- (void) addOperations: (NSArray *)ops

     waitUntilFinished: (BOOL)shouldWait

{

  NSUInteger total;

  NSUInteger index;

 

  if (ops == nil || NO == [ops isKindOfClass: [NSArray class]])

    {

      [NSException raise: NSInvalidArgumentException

  format: @"[%@-%@] object is not an NSArray",

NSStringFromClass([self class]), NSStringFromSelector(_cmd)];

    }

  total = [ops count];

  if (total > 0)

    {

      BOOL invalidArg = NO;

      NSUInteger toAdd = total;

      GS_BEGINITEMBUF(buf, total, id)

 

      [ops getObjects: buf];

      for (index = 0; index < total; index++)

{

  NSOperation *op = buf[index];

 

  if (NO == [op isKindOfClass: [NSOperation class]])

    {

      invalidArg = YES;

      toAdd = 0;

      break;

    }

  if (YES == [op isFinished])

    {

      buf[index] = nil;

      toAdd--;

    }

}

      if (toAdd > 0)

{

          [internal->lock lock];

  [self willChangeValueForKey: @"operationCount"];

  [self willChangeValueForKey: @"operations"];

  for (index = 0; index < total; index++)

    {

      NSOperation *op = buf[index];

 

      if (op == nil)

{

  continue; // Not added

}

      if (NSNotFound

!= [internal->operations indexOfObjectIdenticalTo: op])

{

  buf[index] = nil; // Not added

  toAdd--;

  continue;

}

      [op addObserver: self

  forKeyPath: @"isReady"

      options: NSKeyValueObservingOptionNew

      context: isReadyCtxt];

      [internal->operations addObject: op];

      if (NO == [op isReady])

{

  buf[index] = nil; // Not yet ready

}

    }

  [self didChangeValueForKey: @"operationCount"];

  [self didChangeValueForKey: @"operations"];

  for (index = 0; index < total; index++)

    {

      NSOperation *op = buf[index];

 

      if (op != nil)

{

  [self observeValueForKeyPath: @"isReady"

      ofObject: op

change: nil

      context: isReadyCtxt];

}

    }

          [internal->lock unlock];

}

      GS_ENDITEMBUF()

      if (YES == invalidArg)

{

  [NSException raise: NSInvalidArgumentException

    format: @"[%@-%@] object at index %"PRIuPTR" is not an NSOperation",

    NSStringFromClass([self class]), NSStringFromSelector(_cmd),

    index];

}

    }

  if (YES == shouldWait)

    {

      [self waitUntilAllOperationsAreFinished];

    }

}

 

    NSOperationQueue *mainQueue = [NSOperationQueue currentQueue];

    [mainQueue addOperations:@[op2,op4,op3,op5] waitUntilFinished:YES]; 

主线程将会阻塞,直到队列中的所有任务完成。

- (void) waitUntilAllOperationsAreFinished

{

  NSOperation *op;

 

  [internal->lock lock];

  while ((op = [internal->operations lastObject]) != nil)

    {

      [op retain];

      [internal->lock unlock];

      [op waitUntilFinished];

      [op release];

      [internal->lock lock];

    }

  [internal->lock unlock];

}

 

对比 GCD 与 NSOperationQueue

【100%通过率】华为OD机试真题 Python 实现【投篮大赛】【2022.11 Q4 新题】 你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则: 整数x-表示本回合新获得分数x “+” – 表示本回合新获得的得分是前两次得分的总和。 “D” – 表示本回合新获得的得分是前一次得分的两倍。 “C” – 表示本回合没有分数,并且前一次得分无效,将其从记录中移除。 请你返回记录中所有得分的总和。 阅读详情

相关推荐

从ISO 17987到SAE J2602:LIN一致性测试标准全景解读与CANoe实现

本文深入解析了从ISO 17987到SAE J2602的LIN一致性测试标准技术演进,详细对比了两大标准体系的技术差异,并基于Vector CANoe平台演示了如何构建符合最新行业要求的自动化测试方案。文章重点介绍了SAE J2602标准的三大改进点,包括唤醒特性、传输层协议和诊断服务的增强测试要求,并提供了CANoe测试环境配置、测试模块集成及测试案例解析的实战指南。

app77的博客 335

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

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

欢迎来到一度's博客 496

《统计学习方法》——李航 学习大纲

最近在学习李航写的统计学习方法概论, 每一章都用xmind理清了思路,括号里是书里的公式,第一次写博文,敬请指教~~~~ 第一章 统计学习方法论 第二章 感知机 每个方法其实只需要着重掌握三要素和输入输出就可以了,主要看模型、策略和算法。 感知机主要是二类分类的线性分类模型。 看到后面会注意感知机和支持向量机的区别。 第三章 k近

wjy619251334的博客 1万+

【iOS】NSOperation、NSOperationQueue

寒假学习了GCD,前几天学习了NSThread,今天来学习iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。是苹果提供给我们的一套多线程解决方案。实际上 NSOperation是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。需要配合来实现多线程。

weixin_72437555的博客 1708

单片机开发者的福音:3步搞定VSCode智能补全(IAR工程+Clangd实战)

本文为单片机开发者提供了一套高效解决方案,通过EIDE插件将IAR工程导入VSCode,并生成关键的compile_commands.json文件,结合Clangd配置,仅需三步即可实现精准的智能代码补全、一键跳转等现代编辑功能,大幅提升嵌入式开发效率。

coffee的博客 524

【变化检测】变化检测相关数据集+代码+论文合集

光学影像变化检测领域数据集(有label的,无label的)、高光谱影像变化检测领域数据集、3D变化检测领域数据集、传统变化检测算法、深度学习变化检测算法、SAR变化检测算法、高光谱变化检测算法论文及代码等资源。

向上生长的程序媛的博客 2089

【iOS】NSOperation,NSOperationQueue

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考我们可以通过自定义继承自NSOperation的子类,重写main或者start来定义自己的NSOperation对象。如果只是重写了main方法,有底层控制变更任务执行、完成状态以及任务退出。如果重写了start方法,需要自己控制任务状态。

weixin_61196797的博客 1423

TDS水质检测传感器原理图设计,已量产(液体传感器)

最近调试了一款针对生活用水、水培系统的 TDS 水质检测模块 —— 毕竟 TDS(总溶解固体)值直接关联水的洁净程度,是这类场景里既实用又易获取的水质指标。下面拆解下这个电路的设计逻辑,说说每个部分是怎么配合实现精准检测的。

不脱发的程序猿 1541

NSOperationQueue简介

一、NSOperationQueue简介1.概述: NSOperationQueue类管理NSOperation对象的执行。NSOperationQueue可以被称为操作队列,NSOperation可以被称为操作。操作被添加到操作队列之后,操作队列会根据操作对象的优先级或者相互之间的依赖关系来执行操作。一个应用程序可以创建多个操作队列,每个操作队列分别管理若干操作。2.什么时候操作会被移除: 当操

有志者事竟成-程序员也可以创造优雅的艺术 626

【学习系列】SAP RAP 29:如何创建Application Jobs(下)

本文介绍了在SAP系统中通过API创建和使用Application Jobs的方法。主要内容包括:1) 创建RAP应用并通过Action调用API创建Jobs;2) 使用事件驱动方式异步更新Job状态;3) 通过URL跳转到标准日志页面;4) 使用Custom Entity获取Job日志;5) 演示遗留接口IF_APJ_DT_EXEC_OBJECT和IF_APJ_RT_EXEC_OBJECT的使用。文章提供了详细的代码示例,展示了如何通过CL_APJ_RT_API=>SCHEDULE_JOB调度作业,

DeveloperMrMeng的博客 380

华为OD机试 - 开源项目热度榜单(Java 2025 C卷 100分)

H = Wwatch X#watch + Wstar X#star +Wfork X#fork +Wissue X#issue +Wmr X#mr H表示热度值,Wwatch、Wstar、Wfork、Wissue、Wmr分别表示5个统计维度的权重,#watch、#star、#fork、#issue、#mr分别表示5个统计维度的统计值。

学Java,找哪吒 1756

[iOS开发]NSOperation & NSOperationQueue

NSOperation与NSOperationQueue简单学习

weixin_52192405的博客 1001

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5506

多线程编程(三)NSOperationQueue

NSOperationQueue NSOperation 多线程编程 任务和队列 依赖

qq_32510689的博客 2856

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

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

NSOperation和NSOperationQueue详细讲解

NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperation 操作依赖和优先级、线程间的通信、线程同步和线程安全,以及 NSOperation、NSOperationQueue 常用属性和方法归纳。 文中 Demo 我已放在了 Github 上,Demo 链接:传送门 1、NSOperation、NSOp...

笑看风云的专栏 7974

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

iOS NSOperation和NSOperationQueue解读

NSOperation,即操作对象,是一个**抽象类**,用于封装和单个任务关联的代码和数据。 NSOperationQueue是管理调用一组NSOperation对象的类。

LOLITA0164的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【iOS】—— NSOperation、NSOperationQueue

是苹果提供给我们的一套多线程解决方案。实际上是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。如果使用子类 NSInvocationOperation、NSBlockOperation 不能满足日常需求,我们可以使用自定义继承自 NSOperation 的子类。可以通过重写 main 或者 start 方法 来定义自己的 NSOperation 对象。重写main方法比较简单,我们不需要管理操作的状态属性 isExecuting 和 isFinished。

m0_62386635的博客 853

使用NSOperation以及NSOperationQueue

使用 NSOperation 以及 NSOperationQueue NSOperation vs. Grand Central Dispatch (GCD) 在Mac OS X v10.6和iOS4之前,NSOperation 与 NSOperationQueue 不同于GCD,他们使用了完全不同的机制。 从Mac OS X v10.6和iOS4开始,NSOperati

Flying_in_the_world的专栏 2364

NSOperationQueue串行操作

当使用NSOperationQueue又要求串行操作时,即后一个task对前一个task有依赖关系时,采用如下方式, 方式一: queue=[[NSOperationQueue alloc] init]; int index=1;  MyTask *task=[[[MyTask alloc] init] autorelease];  task.operationId=inde

henry85的专栏 2953

[iOS]-NSOperation、NSOperationQueue

iOS-NSOperation、NSOperationQueue总结

m0_52192682的博客 611

NSOperation、NSOperationQueue使用

文章目录介绍为什么要使用NSOperation而不是GCD?NSOperation、NSOperationQueue 操作和操作队列使用步骤创建操作使用子类 NSInvocationOperation使用子类 NSBlockOperation使用自定义继承自 NSOperation 的子类创建队列将操作加入队列- (void)addOperation:(NSOperation *)op;- (void)addOperationWithBlock:(void (^)(void))block;NSOperati

wtl1804的博客 450

NSOperationQueue小结

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController (void)viewDidLoad { [super viewDidLoad];//全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, 0);//并发队列 di

韩万杰的博客 445

深入学习NSOperationQueue

深入学习多线程

TEL_小超的博客 787
上一篇: NSOperation
下一篇: UIImageView 知识梳理
Coding_Physical
博客等级 码龄12年 160粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值