仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2896|回复: 19
打印 上一主题 下一主题

[学习教程] IOS设计iOS多线程编程之NSOperation和NSOperationQueue的利用仓酷云

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:22 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
管理你的ViewController的层次可以自己写View切换的动画关掉他默认的动画文档:还有个蛋疼的UIWindow都快忘了他了因为iOS是从MacosX过来的很多工具直接拿来用这个UIWindow就是在iOS里每个App独占屏幕所以同时存在的只有一个UIWindow前一篇
《iOS多线程编程之NSThread的利用》

先容三种多线程编程和NSThread的利用,这篇先容NSOperation的利用。
利用NSOperation的体例有两种,

一种是用界说好的两个子类:

NSInvocationOperation和NSBlockOperation。
另外一种是承继NSOperation

假如你也熟习Java,NSOperation就和java.lang.Runnable接口很类似。和Java的Runnable一样,NSOperation也是计划用来扩大的,只需承继重写NSOperation的一个办法main。相称与java中Runnalbe的Run办法。然后把NSOperation子类的对象放进NSOperationQueue行列中,该行列就会启动并入手下手处置它。
NSInvocationOperation例子:

和后面一篇博文一样,我们完成一个下载图片的例子。新建一个SingleViewapp,拖放一个ImageView控件到xib界面。
完成代码以下:

  • #import"ViewController.h"
  • #definekURL@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"

  • @interfaceViewController()

  • @end

  • @implementationViewController

  • -(void)viewDidLoad
  • {
  • [superviewDidLoad];
  • NSInvocationOperation*operation=[[NSInvocationOperationalloc]initWithTarget:self
  • selector:@selector(downloadImage:)
  • object:kURL];

  • NSOperationQueue*queue=[[NSOperationQueuealloc]init];
  • [queueaddOperation:operation];
  • //Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
  • }

  • -(void)downloadImage:(NSString*)url{
  • NSLog(@"url:%@",url);
  • NSURL*nsUrl=[NSURLURLWithString:url];
  • NSData*data=[[NSDataalloc]initWithContentsOfURL:nsUrl];
  • UIImage*image=[[UIImagealloc]initWithData:data];
  • [selfperformSelectorOnMainThread:@selector(updateUI:)withObject:imagewaitUntilDone:YES];
  • }
  • -(void)updateUI:(UIImage*)image{
  • self.imageView.image=image;
  • }

  • viewDidLoad办法里能够看到我们用NSInvocationOperation建了一个背景线程,而且放到NSOperationQueue中。背景线程实行downloadImage办法。
  • downloadImage办法处置下载图片的逻辑。下载完成后用performSelectorOnMainThread实行主线程updateUI办法。
  • updateUI并把下载的图片显现到图片控件中。
运转能够看到下载图片显现在界面上。

<br>
第二种体例承继NSOperation

在.m文件中完成main办法,main办法编写要实行的代码便可。
怎样把持线程池中的线程数?

行列里能够到场良多个NSOperation,能够把NSOperationQueue看做一个线程池,可往线程池中增加操纵(NSOperation)到行列中。线程池中的线程可看做消耗者,从行列中取走操纵,并实行它。
经由过程上面的代码设置:
[queuesetMaxConcurrentOperationCount:5];
线程池中的线程数,也就是并发操纵数。默许情形下是-1,-1暗示没无限制,如许会同时运转行列中的全体的操纵。

管理所有设备发生的事件比如屏幕旋转屏幕关闭或者一些其他的程序的控制逻辑也应该写在这里他的初始化函数是-(id)initWithNibName:(NSString*)nibNamebundle:(NSBundle*)nibBundle后面那个NibName是InterfaceBuilder里设计的界面现在IB已经集成到XCode里了
冷月葬花魂 该用户已被删除
沙发
 楼主| 发表于 2015-1-21 08:52:56 | 显示全部楼层
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-7 07:17

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表