iOS多线程编程 (二)-----NSOperation和NSOperationQueue的使用

Imgui(2) | macOS 绘制 CPU 占用率曲线 实现一个 CPU 占用率曲线绘制的程序, 并能通过按钮触发评测代码的运行;跨平台。使用到了 SFML, imgui-SFML, 以及 macOS 平台特有的 API.绘制曲线 - 以正弦函数为例获取和绘制所有 CPU 的占用率增加按钮: 在界面上开启和关闭评测程序提高绘制频率本篇使用 C++ 实现了一个简陋的 CPU 占用率界面程序, 给出了实现的关键部件, 以及一些探索过程。 阅读详情

前一篇 

《iOS多线程编程之NSThread的使用》

介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用。

使用 NSOperation的方式有两种,

一种是用定义好的两个子类:

NSInvocationOperation 和 NSBlockOperation。

另一种是继承NSOperation

如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似。和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main。相当与java 中Runnalbe的Run方法。然后把NSOperation子类的对象放入NSOperationQueue队列中,该队列就会启动并开始处理它。


NSInvocationOperation例子:

和前面一篇博文一样,我们实现一个下载图片的例子。新建一个Single View app,拖放一个ImageView控件到xib界面。

实现代码如下:

[cpp]  view plain copy
  1. #import "ViewController.h"  
  2. #define kURL @"http://avatar.youkuaiyun.com/2/C/D/1_totogo2010.jpg"  
  3.   
  4. @interface ViewController ()  
  5.   
  6. @end  
  7.   
  8. @implementation ViewController  
  9.   
  10. - (void)viewDidLoad  
  11. {  
  12.     [super viewDidLoad];  
  13.     NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self  
  14.                                                                            selector:@selector(downloadImage:)  
  15.                                                                              object:kURL];  
  16.       
  17.     NSOperationQueue *queue = [[NSOperationQueue alloc]init];  
  18.     [queue addOperation:operation];  
  19.     // Do any additional setup after loading the view, typically from a nib.  
  20. }  
  21.   
  22. -(void)downloadImage:(NSString *)url{  
  23.     NSLog(@"url:%@", url);  
  24.     NSURL *nsUrl = [NSURL URLWithString:url];  
  25.     NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];  
  26.     UIImage * image = [[UIImage alloc]initWithData:data];  
  27.     [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];  
  28. }  
  29. -(void)updateUI:(UIImage*) image{  
  30.     self.imageView.image = image;  
  31. }  

  1. viewDidLoad方法里可以看到我们用NSInvocationOperation建了一个后台线程,并且放到NSOperationQueue中。后台线程执行downloadImage方法。
  2. downloadImage 方法处理下载图片的逻辑。下载完成后用performSelectorOnMainThread执行主线程updateUI方法。
  3. updateUI 并把下载的图片显示到图片控件中。

运行可以看到下载图片显示在界面上。

第二种方式继承NSOperation 

在.m文件中实现main方法,main方法编写要执行的代码即可。

如何控制线程池中的线程数?

队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。

通过下面的代码设置:
[queue setMaxConcurrentOperationCount:5];
线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。


著作权声明:本文由http://blog.youkuaiyun.com/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

使用C++界面框架ImGUI开发一个简单程序 本文记录初次使用ImGui的整个过程,解决了使用过程中的大部分问题,但还有一些细节问题需要解决:字体内存加载方式时软件退出报错字体文件过大时加载耗时导致白屏程序图标自定义,默认窗体标题栏的自定义控件外观自定义,加载图标字体作为控件图标这些问题后面会每个单独写一篇文章处理,目前的内容已经可以开发一些简单的应用。 阅读详情

相关推荐

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

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

什么都不会的小菜鸟 3775

iOS多线程编程之NSOperation和NSOperationQueue的使用

前一篇 《iOS多线程编程之NSThread的使用》介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用。使用 NSOperation的方式有两种,一种是用定义好的两个子类:NSInvocationOperation 和 NSBlockOperation。另一种是继承NSOperation如果你也熟悉Java,NSOperation就和java.lang.Runnabl

空杯子 10万+

mandelbrot-sfml-imgui:使用SFML + ImGui的多线程C ++ Mandelbrot渲染器

多线程SFML + ImGui Mandelbrot 使用SFML + ImGui的多线程C ++ Mandelbrot渲染器。 用法 DESCRIPTION A multi-threaded C++ Mandelbrot renderer using SFML + ImGui. SYNOPSIS mandelbrot [-h] [-v|-vv] [-f] [-n <num>] [--font-size <font>] OPTIONS -h, --help show help -v, --verbose show info log messages (verbose) -vv, --debug show deb

ImGui渲染流程及常用控件总结

ImGui渲染线程及部分控件。。。

rasine_liu的博客 4503

c++ 实时界面工程模板 ImGui

将此vs2019 ImGui工程添加到解决方案下,编译即可,环境以及依赖问题已在工程中解决。方便移植,逻辑代码自行添加。带有配置文件(键:值匹配)解析功能和多线程运行功能。

【学习体会】Lighttools8.4.0:矩形阵列光源+条形光源的光学仿真分析

在solidworks中设计了条形光源的基本结构: 由32*6个矩形led组成矩形光源阵列,如下所示 另存为step文件后,导入lighttools中,这里要设置模型的光学属性为:吸收体(机械) 因为我们设计的光源模型是一个整体,我们不能单个面的设置光源,比如说, 这样做的话并不会是这个面设置为光源,而是会把做一个模型都变成一个光源,如下 这显然不是我们想要的 那么,我们就在led位置上放置一个矩形面光源, 这样我们就放置好了一个面光源, 但是问题是,还有191...

LeonJin的博客 1万+

【iOS】多线程NSOperation,NSOperationQueue

前段时间学习了有关于GCD的内容,这段时间对于的内容再进行一个学习和总结实际上是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。需要配合来实现多线程。操作的定义:执行操作的含义,换句话说其实就是在线程中执行的那段代码,从GCD层面来类比就相当于我们的一个block在中,我们可以采用他的子类来进行一个封装的操作操作队列:这里的队列是值操作队列,就是用来存放操作的队列.不同于GCD中的一个调度队列的FIFO。

qq_73106050的博客 1505

【VSCode】【Clangd】从零构建:基于LLVM/Clangd+MINGW+CMake的Windows高性能C/C++开发环境实战

本文详细介绍了如何在Windows平台搭建基于LLVM/Clangd+MINGW+CMake的高性能C/C++开发环境。通过VSCode配置Clangd语言服务器,结合MINGW提供的GCC工具链和CMake的跨平台构建能力,实现轻量级、高效率的开发体验。文章包含从环境准备到实战配置的完整指南,特别适合追求开发效率和跨平台兼容性的开发者。

weixin_28839629的博客 312

【iOS】NSOperation、NSOperationQueue

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

weixin_72437555的博客 1708

OnlyOffice Docker部署踩坑实录:解决Nginx反向代理导致的editor.bin下载失败

本文详细解析了在Docker中部署OnlyOffice时,因Nginx反向代理配置不当导致editor.bin下载失败的常见问题。通过分析问题根源,提供了从Nginx代理配置、Docker网络设置到OnlyOffice容器内部调整的完整解决方案,并分享了实战调试技巧与性能优化建议,帮助用户彻底解决这一部署难题。

wine的专栏 523

华为od 面试八股文_Python_02_含答案

华为od 面试八股文_Python_02_含答案

MISAYAONE的博客 4533

iOS多线程技术2 - NSOperation和NSOperationQueue的详细用法

NSOperation 和 NSOperationQueue 是苹果提供的一套多线程解决方案,是基于 GCD 的封装,完全面向对象,代码可读性较高。 NSOperation NSOperation 是一个抽象类,并不具备封装操作的能力,用作父类用来约束子类,要想封装操作,必须使用它的子类。 我们可以使用系统提供的两个子类 NSBlockOperation 和 NSInvocationOperati...

毛毛虫 1961

【webrtc】openh264编码:动态配置码控参数触发IDR编码

SetRates 下发RateControlParameters 给到openh264 编码器 void SetRates(const RateControlParameters& parameters) override; LayerConfig 编码器这边的配置是layerconfig,具体到层的: std::vector<LayerConfig> configurations_; void H264EncoderImpl::SetRates(const RateCo.

突围 724

NSOperation和NSOperationQueue详细讲解

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

笑看风云的专栏 7974

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1729

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2020

iOS多线程之NSOperation与NSOperationQueue的使用

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

Rephontil的博客 3342

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【iOS】—— NSOperation、NSOperationQueue

我们可以通过自定义继承自NSOperation的子类,重写main或者start来定义自己的NSOperation对象。如果只是重写了main方法,有底层控制变更任务执行、完成状态以及任务退出。如果重写了start方法,需要自己控制任务状态。重写main方法比较简单,我们不需要管理线程的状态属性executing(是否正在执行)和finished(是否完成)。当main执行完返回的时候,这个操作就结束了。......

m0_55124878的博客 1338

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【iOS】——NSOperation和NSOperationQueue学习总结

首先需要创建一个继承于NSOperation的子类,接着在该类的实现部分重写main方法,我们不需要管理操作的状态属性和isFinished。当main执行完返回的时候,这个操作就结束了。if (!i < 2;i++) {@end//1.创建CustomOperation对象// 2.调用 start 方法开始执行操作[op start];可添加完成的代码块,在操作完成后执行。添加操作之间的依赖关系,方便的控制执行顺序。设定操作执行的优先级。可以很方便的取消或暂停一个操作的执行。

m0_73974920的博客 1856

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【iOS】—— 多线程NSOperation和NSOperationQueue

NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。

qq_72437394的博客 1018

【iOS】NSOperation,NSOperationQueue

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

weixin_61196797的博客 1419

iOS NSOperation和NSOperationQueue解读

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

LOLITA0164的博客 1万+

[转] iOS多线程编程之NSOperation和NSOperationQueue的使用

《iOS多线程编程之NSThread的使用》 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用。 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation。 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.l...

weixin_33941350的博客 216
上一篇: iOS多线程编程 (一) -----NSThread的使用
下一篇: iOS多线程编程(三)----Grand Central Dispatch(GCD)介绍和使用
「已注销」
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值