NSThread、Cocoa NSOperation
简介
iOS有三种多线程编程技术,分别是:
《1. NSThread
《2 Cocoa NSOperation
《3 GCD(全称:Grand Central Dispatch)
这三种编程方式从上到下,抽象度层次是从低到高,抽象度越高的使用越简单,也是Apple最推荐的。
三种方式的优缺点:
- NSThread
-优点:NSThread 比其他两个轻量级,使用简单
-缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对对数据的加锁会有一定的影响
- NSOperation:
- 不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
- NSOperation是面向对象的
- GCD:
- Grand Central Dispatch是由苹果开发的一个多核编程的解决方案,iOS4.0之后才开始使用,
- GCD是基于C语言的。
3. NSThread
NSThread的三种调用方法:
NSThread *mythread = [[NSThread alloc]initWithtarget:self selector:(mythreadAction:) object:nil];
[self performSelectorInBackground:@selector:(mythreadAction:) withObject:nil];
[NSThread detachNewThreadSelector:(myThreadAction:) toTarget:self withObject:nil];
4. 使用NSThread管理线程的主要步骤:
《1 声明一个NSCondition同步锁
《2 声明若干个NSThread子线程
《3 指定NSThread子线程的目标执行方法(可以在构造函数中指定)
《4 设置子线程的名称
《5 star启动子线程
5. 实例代码:
//创建一个进程锁,实现线程同步
self.condition(NSCondition) = [[NSCondition alloc] init];
//创建线程1_thread_1=[[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];[_thread_1 setName:@"thread_1"];[_thread_1 start];//创建线程2_thread_2=[[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];[_thread_2 setName:@"thread_2"];[_thread_2 start];
#pragma mark--线程执行方法
-(void)run{//进程上锁[_condition lock];NSLog(@"运行的线程名:%@",[[NSThread currentThread]name]);if ([[[NSThread currentThread]name] isEqualToString:@"thread_1"]) {NSLog(@"111");NSURL *imageUrl_1=[NSURL URLWithString:@"http://t.beauty-soft.net/upload/ceiba20130224_014522_8679.jpg"];NSData *data_1=[NSData dataWithContentsOfURL:imageUrl_1];UIImage *image_1=[UIImage imageWithData:data_1];UIImageView *imageView_1=[[UIImageView alloc] initWithImage:image_1];imageView_1.frame=CGRectMake(60, 20, 200, 200);[self.view addSubview:imageView_1];[imageView_1 release]; }else if([[[NSThread currentThread]name] isEqualToString:@"thread_2"]){NSLog(@"222"); NSURL *imageUrl_2=[NSURL URLWithString:@"http://t.beauty-soft.net/upload/ceiba20120704_121437_3455.jpg"]; NSData *data_2=[NSData dataWithContentsOfURL:imageUrl_2];UIImage *image_2=[UIImage imageWithData:data_2];UIImageView *imageView_2=[[UIImageView alloc] initWithImage:image_2];imageView_2.frame=CGRectMake(60, 250, 200, 200);[self.view addSubview:imageView_2];[imageView_2 release];}//解锁[_condition unlock];
}
6. NSOperationQueue类
如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量。NSOperationQueue的使用步骤如下:
1)声明一个NSOperationQueue对象
2)声明若干个NSInvocationOperation子线程对象,并指定回调方法;
3)将NSInvocationOperation子线程添加到数组;
4)把数组赋给NSOperationQueue类中的addOperations方法;
5) 实现回调方法;
6)在回调方法中实现performSelectorOnMainThread方法,更新主线程上的界面UI元素。
队列及操作:
NSOperationQueue有两种不同类型的队列:主队列和自定义队列.
主队列运行在主线程上,自定义队列在后台执行.
队列处理的任务是NSOperation的子类:NSInvocationOperation 和 NSBlockOperation.
NSOperation的基本使用步骤:
定义操作队列 --> 定义操作 -->将操作添加到队列.
提示:
一旦将操作添加到队列,操作就会立即被调度执行.
NSInvocationOperation(调度操作)
1> 定义队列:
?
1
|
self.myQueue = [[NSOpertaionQueue alloc] init];
|
2> 操作调用的方法:
?
1
2
3
4
|
-( void )operationAction:(id)obj
{
NSLog(@ "%@----obj : %@ " ,[NSThread currentThread], obj);
};
|
3> 定义操作并添加到队列:
?
1
2
3
|
NSInvocationOperation *op = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(operationAction:) object:@(i)];
[self.myQueue addOperation:op]
|
提示:需要准备一个被调度的方法,并且能够接收一个参数.
NSBlockOperation(块操作)
定义操作并添加到队列:
?
1
2
3
4
|
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
[self operationAction:@ "Block Operation" ];
}];
[self.myQueue addOperation:op];
|
NSBlockOperation比NSInvocationOperation更加灵活;
设置操作的依赖关系:
利用 " addDependency "可以指定操作之间彼此的依赖关系(执行先后顺序),但是注意不要出现循环依赖.
设置同时并发的线程数量:
?
1
|
[self.myQueue setMaxConcurrentOperationCount:2];
|
6. NSOperaionQueue的实例代码:
_opeartionQueue=[[NSOperationQueue alloc] init];//队列最大同时运行数量[_opeartionQueue setMaxConcurrentOperationCount:1];tags=20;//创建线程1NSInvocationOperation *invocationOpearation_1=[[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"http://t.beauty-soft.net/upload/ceiba20130224_014522_8679.jpg"] autorelease];//创建线程2NSInvocationOperation *invocationOpearation_2=[[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run:) object:@"http://t.beauty-soft.net/upload/ceiba20120704_121437_3455.jpg"] autorelease];NSArray *array=@[invocationOpearation_1,invocationOpearation_2];//把程序添加到管理器中[_opeartionQueue addOperations:array waitUntilFinished:YES];
转载于:https://my.oschina.net/u/2322034/blog/412450
NSThread、Cocoa NSOperation相关推荐
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
iOS有三种多线程编程的技术,分别是:NSThread .Cocoa NSOperation .GCD. 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使 ...
- 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
转自容芳志的博客 简介 iOS有三种多线程编程的技术,分别是: (一)NSThread (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch) ...
- iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...
- XCode、Objective-C、Cocoa 说的是几样东西
大部分有一点其他平台开发基础的初学者看到XCode,第一感想是磨拳擦掌,看到 Interface Builder之后,第一感想是跃跃欲试,而看到Objective-C的语法,第一感想就变成就望而却步了 ...
- iOS的GCD、NSThread、NSOperation、锁、Runloop的介绍和使用
GCD GCD (Grand Central Dispatch) GCD两个核心概念:任务和队列 任务 任务就是执行操作的意思,也就是block那段代码.执行操作有两种:同步执行和异步执行. 同步执行 ...
- 多线程——NSThread、GCD、NSOperation
1.前言: 一个应用程序就是一个进程,一个进程至少包含一个线程,程序启动会自动创建一个主线程,负责UI界面的现实和控件事件的监控.多线程可以更充分的利用系统CPU资源,一定程度上提升程序的性能.1个进 ...
- UI一揽子计划 22 (多线程概述、NSThread、NSOperationQueue 、GCD、多线程管理)
一.多进程概述: 进程: 一个正在运行的程序 叫做一个进程 多进程: 多个程序正在运行 叫做多线程 线程: 一个进程 都会有一个或多个线程 如果只有一个 叫做主线程 主线程负 ...
- iOS开发笔记 2、Cocoa简明
历史 NeXSTEP Many years ago Cocoa was known as NeXTSTEP . NeXT Computer developed and released version ...
- ⑪(面试篇 2/3)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文)
iOS面试题 一共分为笔试题和面试题两部分 笔试题 一共分为10个 总共613题 面试题 一共400题 笔试题 一个10个系列 分别为 ①(语法篇) 共147题 已更新 ②(常识篇) 共72题 已更新 ...
- iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)
文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...
最新文章
- 阿里终面:怎么用 UDP 实现 TCP?
- 整数转换为罗马数字 Integer to Roman
- android图像处理(3)底片效果
- GoCart 分类和产品 测试一
- 柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)...
- 蓝桥练习-算法训练 P0505
- flink网页端提交pr-修改文档报错
- robo3t设置密码链接
- mysql 5.7 mts_mysql5.7 中启用MTS后error log中大量Note日志分析
- 《偶像爱豆出身的编程语言排行第一得主!谁还敢嘲python没实力?》Python应用与实践
- JavaScript var语句简析
- php案例之后台数据显示-- PDO版(php data object)
- std::vector内存清理
- 嵌入式ARM(Allwinner H3)下使用rtl8188eus无线网卡
- 数字逻辑电路期末复习与常见问题
- 计算机组装大赛活动感悟,计算机组装大赛总结参考
- 基于单片机的通用定时器调度器SmartTimer
- Android 图片裁切框架 uCrop 的用法
- U8 ActiveX 部件不能创建对象
- 【Adobe】怎样给音频升降调?
热门文章
- 广州客村计算机培训,愿达客村校区西班牙语培训班
- 更新 FF.PyAdmin v1.2
- MySQL高级进阶(三)、InnoDB存储引擎详解
- matlab序列码,Matlab7 R14(sn 序列号)
- 【模糊神经网络】基于matlab的模糊神经网络仿真
- codejock suite pro 20.2 for ActiveX
- snmp扫描工具linux,SugarNMSTool-SugarNMSTool(snmp工具)下载 v2.0官方版--pc6下载站
- ajax异步加载网页爬虫
- 计算机硬盘 安装,电脑新硬盘如何安装系统
- 1400协议是什么和28181区别_支持对接GB28181吗?监控,智能摄像头,国标推流,RTSP...