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界面。

实现代码如下:

 #import "ViewController.h"
#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
selector:@selector(downloadImage:)
object:kURL]; NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation];
// Do any additional setup after loading the view, typically from a nib.
} -(void)downloadImage:(NSString *)url{
NSLog(@"url:%@", url);
NSURL *nsUrl = [NSURL URLWithString:url];
NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];
UIImage * image = [[UIImage alloc]initWithData:data];
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
-(void)updateUI:(UIImage*) image{
self.imageView.image = image;
}
  1. viewDidLoad方法里可以看到我们用NSInvocationOperation建了一个后台线程,并且放到NSOperationQueue中。后台线程执行downloadImage方法。
  2. downloadImage 方法处理下载图片的逻辑。下载完成后用performSelectorOnMainThread执行主线程updateUI方法。
  3. updateUI 并把下载的图片显示到图片控件中。

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

第二种方式继承NSOperation

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

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

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

通过下面的代码设置:

 [queue setMaxConcurrentOperationCount:];

线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。

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

最新文章

  1. yii2 如何用命名空间方式使用第三方类库
  2. BPEL是个什么东东
  3. ecstore菜鸟电子面单对接摘要
  4. windows远程控制ubuntu尝试--未成功
  5. HDU 5795:A Simple Nim(博弈)
  6. HTML 5中的文件处理之FileAPI(转载)
  7. Error building results for action sayHello in namespace /inteceptor -
  8. pycharm的激活
  9. Java 判断多级路径是否存在,不存在就创建
  10. Tomcat配置全攻略
  11. Android源码解析——Toast
  12. teamviewer quicksupport 插件(下载)
  13. eclipse使用svn
  14. samba 二进制包 tar.gz 安装
  15. swiper4自动轮播切换手动触碰后停止踩坑——属性disableOnInteraction
  16. Paypal Rest Api自定义物流地址(跳过填写物流地址)
  17. 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分
  18. 【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用
  19. Asp.Net MVC源码调试
  20. 烈焰遮天 cocos 手游mmo 源码 解析

热门文章

  1. C++ vector容器删除操作
  2. freeMarker(十三)——XML处理指南之揭示XML文档
  3. NodeJS中 Path 模块
  4. linux命令学习(8):mv命令
  5. uboot命令(1):mmc命令
  6. 洛谷【P1104】生日(选择排序版)
  7. mac下安装node
  8. Kill掉MySQL中所有sleep的client线程 (转)
  9. Python:collections的deque()方法
  10. Java常见设计模式之适配器模式