NSOperation

   一.NSOperation
     
     NSOperation是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:
     (1) Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperationNSBlockOperation
     (2) 自定义子类继承NSOperation,实现内部相应的方法


     NSInvocationOperation
     
     基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类
     
     NSInvocationOperation *invocatinOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocatinOperationFunctiuon) object:nil];
     [invocatinOperation start];
     
     NSBlockOperation
     
     能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
     NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"NSBlockOperation实例测试");
     }];
     
     [blockOperation addExecutionBlock:^{
        NSLog(@"又执行了1个新的操作,线程:%@", [NSThread currentThread]);
     }];
     
     [blockOperation start];


     .为什么优先使用NSOperationQueue而不是GCD


     例子请求网络数据:
     dispatch_async(_Queue, ^{
     
        NSData *data = [NSData dataWithContentURL:[NSURL URLWithString:@"http://domain.com/a.png"]];
     
        dispatch_async(dispatch_get_main_queue(), ^{
     
            [self refreshViews:data];
        });
     
     });
     没错,它是可以正常的工作,但是有个致命的问题:这个任务是无法取消的 dataWithContentURL:是同步的拉取数据,它会一直阻塞线程直到完成请求,如果是遇到了超时的情况,它在这个时间内会一直占有这个线程;在这个期间并发队列就需要为其他任务新建线程,这样可能导致性能下降等问题。
     因此我们不推荐这种写法来从网络拉取数据。
     操作队列(operation queue)是由 GCD提供的一个队列模型的 Cocoa 抽象。GCD提供了更加底层的控制,而操作队列则在 GCD 之上实现了一些方便的功能,这些功能对于 app的开发者来说通常是最好最安全的选择。NSOperationQueue相对于GCD来说有以下优点:
     (1)提供了在 GCD中不那么容易复制的有用特性。
     (2)可以很方便的取消一个NSOperation的执行
     (3)可以更容易的添加任务的依赖关系
     (4)提供了任务的状态:isExecuteing, isFinished.


     . NSOperationQueue


     NSOperationQueue有两种不同类型的队列:主队列和自定义队列。主队列运行在主线程之上,而自定义队列在后台执行。在两种类型中,这些队列所处理的任务都使用 NSOperation的子类来表述。
    
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  //主队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        //任务执行
    }];
    [queue addOperation:operation];
    
    我们可以通过设置 maxConcurrentOperationCount属性来控制并发任务的数量,当设置为 1 时,那么它就是一个串行队列。主对列默认是串行队列,这一点和 dispatch_queue_t是相似的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值