iOS多线程之 NSOperation和NSOpreationQueue的使用

来源:互联网 发布:醉红楼聊天软件下载 编辑:程序博客网 时间:2024/05/29 06:43

NSOpreation使用方式有两种

  一种是用定义好的两个类

  NSInvocaionOpreation和NSBlockOpreaion

 另继承NSOpreation

  和java.lang.Runnable接口相似 只需继承重写NSOpreation的一个方法main 然后把NSOpreation子类对象放入NSOpreaionQueue队列中 队列就会启动并处理

  NSInvocationOpration例子

  .h

  #import<UIKit/UIKit.h>

  @interface ViewController:UIViewController

  @property(weak,nonatomic)IBoutlet UIimageView * imageView;

  @end

  #define KURL@“”

  @interface ViewController()

  @end

  @implementation ViewController

  -(void)viewDidLoad{

  [super viewDidLoad];

  NSinvocationOpreation * opreation=[[NSInvocationOpration]initWithTarget:self selector:@selector(downloadImage:)object:KURL];

  NSOperationQueue * queue=[[NSOperationQueue alloc]init]; 

  [queue addOperation:operation];

  }

  -(void)downloadImage:(NSString*)url{

 NSlog(@“url:%@“,url);

  NSURL * nsUrl=[NSURL URLWithString:url];

  NSData * data=[[NSData alloc]initWithContentsOfURL:Url];

  UIImage * image=[[UIImage alloc]initWithData:data];

  [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

  }

 -(void)updateUI:(UIImage*)imaeg{

 self.imageView.image=image;

 }

  1viewDidLoad方法里我们用NSInvocation建立了一个后台线程 并且放到NSOpreationQueue中。后台线程执行downloadImage方法

  2downloadImage方法处理下载图片的逻辑。下载完成后用performSelectorOnMainThread执行主线程的updateUI方法

  3updataUI并把下载的图片显示到图片控件中

  第二种方式继承NSOpreation

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

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

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

  并执行它

  [queue setMaxConcurrentOprationCount:5];

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

0 0
原创粉丝点击