美文网首页iOS之家
iOS多线程-NSOperation实践

iOS多线程-NSOperation实践

作者: 小小土豆dev | 来源:发表于2017-07-01 22:36 被阅读24次

    推荐文章

    iOS多线程-NSThread实践

    iOS多线程-GCD实践


    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, 并添加任何你想要的行为。

    Demo下载地址

    相关文章

      网友评论

        本文标题:iOS多线程-NSOperation实践

        本文链接:https://www.haomeiwen.com/subject/bdigcxtx.html