1. 简介

    iOS有三种多线程编程技术,分别是:

    《1. NSThread

    《2 Cocoa NSOperation

    《3 GCD(全称:Grand Central Dispatch)

    这三种编程方式从上到下,抽象度层次是从低到高,抽象度越高的使用越简单,也是Apple最推荐的。

  2. 三种方式的优缺点:

    - 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相关推荐

  1. iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    iOS有三种多线程编程的技术,分别是:NSThread .Cocoa NSOperation .GCD. 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使 ...

  2. 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    转自容芳志的博客 简介 iOS有三种多线程编程的技术,分别是: (一)NSThread  (二)Cocoa NSOperation (三)GCD(全称:Grand Central Dispatch) ...

  3. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  4. XCode、Objective-C、Cocoa 说的是几样东西

    大部分有一点其他平台开发基础的初学者看到XCode,第一感想是磨拳擦掌,看到 Interface Builder之后,第一感想是跃跃欲试,而看到Objective-C的语法,第一感想就变成就望而却步了 ...

  5. iOS的GCD、NSThread、NSOperation、锁、Runloop的介绍和使用

    GCD GCD (Grand Central Dispatch) GCD两个核心概念:任务和队列 任务 任务就是执行操作的意思,也就是block那段代码.执行操作有两种:同步执行和异步执行. 同步执行 ...

  6. 多线程——NSThread、GCD、NSOperation

    1.前言: 一个应用程序就是一个进程,一个进程至少包含一个线程,程序启动会自动创建一个主线程,负责UI界面的现实和控件事件的监控.多线程可以更充分的利用系统CPU资源,一定程度上提升程序的性能.1个进 ...

  7. UI一揽子计划 22 (多线程概述、NSThread、NSOperationQueue 、GCD、多线程管理)

    一.多进程概述:     进程: 一个正在运行的程序 叫做一个进程     多进程: 多个程序正在运行 叫做多线程     线程: 一个进程 都会有一个或多个线程 如果只有一个 叫做主线程  主线程负 ...

  8. iOS开发笔记 2、Cocoa简明

    历史 NeXSTEP Many years ago Cocoa was known as NeXTSTEP . NeXT Computer developed and released version ...

  9. ⑪(面试篇 2/3)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文)

    iOS面试题 一共分为笔试题和面试题两部分 笔试题 一共分为10个 总共613题 面试题 一共400题 笔试题 一个10个系列 分别为 ①(语法篇) 共147题 已更新 ②(常识篇) 共72题 已更新 ...

  10. iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)

    文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...

最新文章

  1. 阿里终面:怎么用 UDP 实现 TCP?
  2. 整数转换为罗马数字 Integer to Roman
  3. android图像处理(3)底片效果
  4. GoCart 分类和产品 测试一
  5. 柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)...
  6. 蓝桥练习-算法训练 P0505
  7. flink网页端提交pr-修改文档报错
  8. robo3t设置密码链接
  9. mysql 5.7 mts_mysql5.7 中启用MTS后error log中大量Note日志分析
  10. 《偶像爱豆出身的编程语言排行第一得主!谁还敢嘲python没实力?》Python应用与实践
  11. JavaScript var语句简析
  12. php案例之后台数据显示-- PDO版(php data object)
  13. std::vector内存清理
  14. 嵌入式ARM(Allwinner H3)下使用rtl8188eus无线网卡
  15. 数字逻辑电路期末复习与常见问题
  16. 计算机组装大赛活动感悟,计算机组装大赛总结参考
  17. 基于单片机的通用定时器调度器SmartTimer
  18. Android 图片裁切框架 uCrop 的用法
  19. U8 ActiveX 部件不能创建对象
  20. 【Adobe】怎样给音频升降调?

热门文章

  1. 广州客村计算机培训,愿达客村校区西班牙语培训班
  2. 更新 FF.PyAdmin v1.2
  3. MySQL高级进阶(三)、InnoDB存储引擎详解
  4. matlab序列码,Matlab7 R14(sn 序列号)
  5. 【模糊神经网络】基于matlab的模糊神经网络仿真
  6. codejock suite pro 20.2 for ActiveX
  7. snmp扫描工具linux,SugarNMSTool-SugarNMSTool(snmp工具)下载 v2.0官方版--pc6下载站
  8. ajax异步加载网页爬虫
  9. 计算机硬盘 安装,电脑新硬盘如何安装系统
  10. 1400协议是什么和28181区别_支持对接GB28181吗?监控,智能摄像头,国标推流,RTSP...