iOS多线程-NSOperation实践
推荐文章
NSOperation只是一个抽象类,所以不能封装任务。使用NSOperation的方式有2种:
1> Foundation框架提供了两个NSOperation的子类直接供我们使用:NSInvocationOperation和NSBlockOperation。
2> 自定义子类继承NSOperation,实现内部相应的方法。
创建一个Operation后,需要调用start方法来启动任务。NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行
NSInvocationOperation
1、创建NSInvocationOperation对象
#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:kURL];
-(void)downloadImage:(NSString*)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;
}
2、开始执行
[operation start];
operation开始执行之后,默认会一直执行操作直到完成,我们也可以调用cancel方法中途取消操作
[operation cancel];
3、把NSInvocationOperation放到NSOperationQueue队列中
NSOperationQueue*queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
注意:
如果你创建了一个NSInvocationOperation任务,把它加入NSOperationQueue队列中,此时不需要调用start方法,它会自动开启异步执行。一个NSInvocationOperation对象就是一个线程。
控制线程池中的线程数(线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作)
[queue setMaxConcurrentOperationCount:5];
4、监听操作的执行:如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
operation.completionBlock= ^() {
NSLog(@"执行完毕");
};
//或者
[operationsetCompletionBlock:^() {
NSLog(@"执行完毕");
}];
NSBlockOperation
1、创建NSBlockOperation对象
NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock:^(){
NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);
}];
addExecutionBlock:,通过这个方法可以给Operation添加多个执行Block
[operation addExecutionBlock:^() {
NSLog(@"又执行了1个新的操作,线程:%@", [NSThreadcurrentThread]);
}];
2、开始任务
[operation start];
自定义NSOperation
如果NSInvocationOperation和NSBlockOperation对象不能满足需求, 你可以直接继承NSOperation, 并添加任何你想要的行为。