在任何编程语言中,多线程的使用都是一个难点,在OC也是如此,从狮子系统之后,有了NSOperation和NSOperationQuene,NSOperation是对NSThread进行了封装,使得使用多线程不再象以前那么复杂。
如果大家对java语言比较熟悉,那么NSOperation就相当于Runnable接口,在Runnable中必须改写的方法名run
需求:
从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,所以我开创建了一个线程,根据该地址去取得图片的数据。创建方法和上面一样,我就不多说了