美文网首页
NSOperation

NSOperation

作者: iOS程序媛ing | 来源:发表于2018-03-16 16:07 被阅读7次

    1.1、NSOperationQueue为我们提供两种队列,主队列和自定义队列,主队列运行在主线程上,自定义队列运行在后台线程上,

    •在主队列添加任务时,需要调用star方法执行任务,否则无法执行任务(无法打印“111”);

    不需要执行addOperation方法

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"111"); }];

    [operation start];

    •使用自定义队列,不需要调用start方法

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

     queue.maxConcurrentOperationCount = 1;//最大并发操作数,1为串行队列,不为1为并行队列,最大并发操作数不是最大开辟线程数,指的是能同时处理几个任务

     NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{

     NSLog(@"operation1%@", [NSThread currentThread]);

     }];

     NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

     NSLog(@"operation2%@", [NSThread currentThread]);

     }];

    [queue addOperation:operation1];//添加任务到队列

     [queue addOperation:operation2];

    1.2、线程间的通信

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"111");

    //回到主线程,刷新UI

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

    }];

    }];

    [queue addOperation:operation1];//添加任务到队列

    1.3、 NSOperation 常用属性和方法 

    取消操作方法

    - (void)cancel;可取消操作,实质是标记 isCancelled 状态。

    判断操作状态方法

    - (BOOL)isFinished;判断操作是否已经结束。

    - (BOOL)isCancelled;判断操作是否已经标记为取消。

    - (BOOL)isExecuting;判断操作是否正在在运行。

    - (BOOL)isReady;判断操作是否处于准备就绪状态,这个值和操作的依赖关系相关。

    操作同步

    - (void)waitUntilFinished;阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。

    - (void)setCompletionBlock:(void (^)(void))block;completionBlock会在当前操作执行完毕时执行 completionBlock。

    - (void)addDependency:(NSOperation *)op;添加依赖,使当前操作依赖于操作 op 的完成。

    - (void)removeDependency:(NSOperation *)op;移除依赖,取消当前操作对操作 op 的依赖。

    @property (readonly, copy) NSArray *dependencies;在当前操作开始执行之前完成执行的所有操作对象数组。

    3.2 NSOperationQueue 常用属性和方法

    取消/暂停/恢复操作

    - (void)cancelAllOperations;可以取消队列的所有操作。

    - (BOOL)isSuspended;判断队列是否处于暂停状态。 YES 为暂停状态,NO 为恢复状态。

    - (void)setSuspended:(BOOL)b;可设置操作的暂停和恢复,YES 代表暂停队列,NO 代表恢复队列。

    操作同步

    - (void)waitUntilAllOperationsAreFinished;阻塞当前线程,直到队列中的操作全部执行完毕。

    添加/获取操作`

    - (void)addOperationWithBlock:(void (^)(void))block;向队列中添加一个 NSBlockOperation 类型操作对象。

    - (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait;向队列中添加操作数组,wait 标志是否阻塞当前线程直到所有操作结束

    - (NSArray *)operations;当前在队列中的操作数组(某个操作执行结束后会自动从这个数组清除)。

    - (NSUInteger)operationCount;当前队列中的操作数。

    获取队列

    + (id)currentQueue;获取当前队列,如果当前线程不是在 NSOperationQueue 上运行则返回 nil。

    + (id)mainQueue;获取主队列。

    注意:

    这里的暂停和取消(包括操作的取消和队列的取消)并不代表可以将当前的操作立即取消,而是当当前的操作执行完毕之后不再执行新的操作。

    暂停和取消的区别就在于:暂停操作之后还可以恢复操作,继续向下执行;而取消操作之后,所有的操作就清空了,无法再接着执行剩下的操作。

    相关文章

      网友评论

          本文标题:NSOperation

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