iOS多线程 的 线程同步
2016-01-11 11:42
218 查看
http://www.beauty-soft.net/blog/ceiba/object-c/2013-04-23/628.html
在Object-c中,常用的多线程处理类分别为NSThread和NSOperationQueue。使用这两个类处理多线程,让复杂的多线程处理变得简单高效。下面分别介绍。
一、NSThread类
苹果公司的Cocoa框架共支持三种多线程机制,分别为NSThread、GCD(Grand Central Dispatch)、Cocoa NSOperatio。NSThree是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。初次接触的读者也许会觉得生涩,但事实上NSThread类已经提供了完善的接口,在使用方式上并不会太难。使用NSTread管理线程,主要的步骤如下。
1)声明一个NSCondition同步锁;
2)声明若干个NSThread子线程;
3)指定NSThread子线程的目标指行方法(可以在构造函数中指定);
4)设置子线程的名称;
5)star启动子线程。
其中,子线程的执行方法一般只需要一个共同方法即可(可以通过线程名,分辨当前的执行线程)。下面通过代码演示NSThread类的使用。假设我们需要下载网络图片,在非异步形式的情况下,IOS界面必须等到图片下载完毕后,UI才会反应。这时利用多线程就可以达到异步下载的效果。
ViewController1.h
ViewController1.m
二、NSOperationQueue类
如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量。NSOperationQueue的使用步骤如下。
1)声明一个NSOperationQueue对象;
2)声明若干个NSInvocationOperation子线程对象,并指定回调方法;
3)将NSInvocationOperation子线程添加到数组;
4)把数组赋给NSOperationQueue类中的addOperations方法;
5) 实现回调方法;
6)在回调方法中实现performSelectorOnMainThread方法,更新主线程上的界面UI元素。
下面,使用NSOperationQueue类,实现前面NSThread类相同的功能(即下载图片)。代码如下。
ViewController2.m
[self performSelectorOnMainThread:@selector(updateLabel:)withObject:updateData waitUntilDone:YES]; 该方法是一个主线程同步方法,不仅可以应用在NSOpeartionQueue中,同样还适用于NSThread类。
在Object-c中,常用的多线程处理类分别为NSThread和NSOperationQueue。使用这两个类处理多线程,让复杂的多线程处理变得简单高效。下面分别介绍。
一、NSThread类
苹果公司的Cocoa框架共支持三种多线程机制,分别为NSThread、GCD(Grand Central Dispatch)、Cocoa NSOperatio。NSThree是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。初次接触的读者也许会觉得生涩,但事实上NSThread类已经提供了完善的接口,在使用方式上并不会太难。使用NSTread管理线程,主要的步骤如下。
1)声明一个NSCondition同步锁;
2)声明若干个NSThread子线程;
3)指定NSThread子线程的目标指行方法(可以在构造函数中指定);
4)设置子线程的名称;
5)star启动子线程。
其中,子线程的执行方法一般只需要一个共同方法即可(可以通过线程名,分辨当前的执行线程)。下面通过代码演示NSThread类的使用。假设我们需要下载网络图片,在非异步形式的情况下,IOS界面必须等到图片下载完毕后,UI才会反应。这时利用多线程就可以达到异步下载的效果。
ViewController1.h
如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量。NSOperationQueue的使用步骤如下。
1)声明一个NSOperationQueue对象;
2)声明若干个NSInvocationOperation子线程对象,并指定回调方法;
3)将NSInvocationOperation子线程添加到数组;
4)把数组赋给NSOperationQueue类中的addOperations方法;
5) 实现回调方法;
6)在回调方法中实现performSelectorOnMainThread方法,更新主线程上的界面UI元素。
下面,使用NSOperationQueue类,实现前面NSThread类相同的功能(即下载图片)。代码如下。
ViewController2.m
相关文章推荐
- IOS开发证书的一些经验
- iOS简单实现仪表盘进度动画
- iOS—修改AFNetworking源文件可接收text/plain的方法
- iOS为什么获取不到设备的DeviceToken
- iOS GCD 和信号量 实现 生产者和消费者模式
- iOS系统GCD学习(5):信号量机制
- iOSMasonry介绍与使用实践
- ios 块的使用(block)
- iOS 通讯录备份、恢复
- iOS 证书的那些坑
- iOS音频播放(ios自学笔记)
- IOS实现输入验证码、密码按位分割(二)
- ios开发——日常之dyld: Library not loaded: @rpath/MySDK.framework/MySDK 错误解决
- iOS标准时间与时间戳相互转换
- iOS 开发中在导航栏添加多个按钮并改变它的位置
- IOS实现自定义布局瀑布流
- iOS 真机测试提示"The identity used to sign the executable is no longer valid."
- iOS调用系统相册、相机 不能显示中文-解决方法
- iOS 自带定位服务
- iOS自定义Tabbar