NSOperation与NSOperationQuene的使用

在任何编程语言中,多线程的使用都是一个难点,在OC也是如此,从狮子系统之后,有了NSOperation和NSOperationQuene,NSOperation是对NSThread进行了封装,使得使用多线程不再象以前那么复杂。

如果大家对java语言比较熟悉,那么NSOperation就相当于Runnable接口,在Runnable中必须改写的方法名run



,在NSOperation中需要改写的方法叫做main, 下面用一个例子讲解如何使用多线程。

需求:

从google上搜索一些图片,利用tableView展示这些图片和图片的标题,其中用到的技术是json(记得下载json )

google公司有一个关于图片搜索的api,我们可以使用该api制作自己的图片搜索工具。下面进入正题:

写一个DownLoadImage类,集成NSOperation

头文件

@interface DownLoadImage : NSOperation{
	NSURL *imageURL;
	id target;
	SEL action;

}
-(id)initWithImageURL:(NSURL*)imageURL target:(id)withTarget action:(SEL)theAction;
@end

实现文件


#import "DownLoadImage.h"
#import"JSON.h"

@implementation DownLoadImage
-(id)initWithImageURL:(NSURL*)theimageURL target:(id)withTarget action:(SEL)theAction
{
	self=[super init];
	if(self)
	{
		imageURL=[theimageURL retain];
		action=theAction;
		target=withTarget;
	}
	return self;
}

-(void)main
{//NSString *urlString=@"http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=macbooks";//NSURL *url=[NSURL  URLWithString:urlString];NSString *jsonString=[NSString stringWithContentsOfURL:imageURL encoding:NSUTF8StringEncoding error:nil];NSDictionary *result=[jsonString JSONValue];//NSLog(@"result is =====%@",result);[target performSelectorOnMainThread:action withObject:result waitUntilDone:NO];
}
@end
}


}


 

 

在该类中,有三个属性,其中imageUL是要下载图片的google提供的一个URL,我们适当修改就可以修改

http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=macbooks,其中,红色部分是不变的部分,后面是我们搜索的内容,如果学过web开发的同学相信都懂的。
action :是该线程执行完毕后,回调的方法。

target:通常是创建该线程的类


当我们向上面的url发送请求后,便会返回一个json,我们将该json解析后,放入一个NSDictionary,并将他传递给action

此时该线程就执行完毕了,就会跳到主线程中执行action


下面在ViewController中写一个函数DownLoadFinish

-(void)downLoadFinish:(NSDictionary *)result
{
	
	NSArray *array=[[result objectForKey:@"responseData"] objectForKey:@"results"];
	NSLog(@"count is%d",[array count]);
	for (NSDictionary *dic in array) {
		
		NSString *title=[dic objectForKey:@"title"];
		[photoName addObject:title];
		NSString *url=[dic objectForKey:@"url"];
		[photoURL addObject:url];
		NSURL *strurl=[NSURL URLWithString:url];
		NSLog(@"start load");
		LoadImage *load=[[LoadImage alloc] initWithURL:strurl action:@selector(LoadOver:) target:self Key:[title copy]];
		[operationQueue addOperation:load];
				
	}
	
	[(UITableView*)self.view reloadData];
	//NSLog(@"解析完毕。。。。。");
	[indicator stopAnimating];
	
	//NSLog(@"num of photo %d",[photoName count]);
	
}

在控制器中的ViewWillAppear中创建一个线程,并放入NsOperationQuenue中,

-(void)viewWillAppear:(BOOL)animated

{

NSURL *url=[NSURLURLWithString:@"http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=macbooks"];

DownLoadImage *down=[[DownLoadImagealloc]initWithImageURL:urltarget:selfaction:@selector(downLoadFinish:)];

[operationQueueaddOperation:down];

}

如果大家细心,会发现在downLoadFinish中还有一个LoadImage线程,线程是为了异步加载图片用的,因为图片的标题可以在json数据获得,而图片本身在json中只是放的url,所以我开创建了一个线程,根据该地址去取得图片的数据。创建方法和上面一样,我就不多说了





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值