zoukankan      html  css  js  c++  java
  • 多线程 NSOperation

    多线程
    NSOperation

    NSOperation的作用

    p配合使用NSOperation和NSOperationQueue也能实现多线程编程
    p

    NSOperation和NSOperationQueue实现多线程的具体步骤

    p先将需要执行的操作封装到一个NSOperation对象中
    p然后将NSOperation对象添加到NSOperationQueue中
    p系统会自动将NSOperationQueue中的NSOperation取出来
    p将取出的NSOperation封装的操作放到一条新线程中执行
    p

    NSOperation的子类

    NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类

    使用NSOperation子类的方式有3种

    pNSInvocationOperation
    pNSBlockOperation
    p自定义子类继承NSOperation,实现内部相应的方法

    NSInvocationOperation

    创建NSInvocationOperation对象

    - (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

    调用start方法开始执行操作

    - (void)start;

    一旦执行操作,就会调用target的sel方法

    注意

    p默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
    p只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

    NSBlockOperation

    创建NSBlockOperation对象

    + (id)blockOperationWithBlock:(void (^)(void))block;

    通过addExecutionBlock:方法添加更多的操作

    - (void)addExecutionBlock:(void (^)(void))block;

    注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

    NSOperationQueue

    NSOperationQueue的作用

    pNSOperation可以调用start方法来执行任务,但默认是同步执行的
    p如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作
    p
    n添加操作到NSOperationQueue中

    - (void)addOperation:(NSOperation *)op;

    - (void)addOperationWithBlock:(void (^)(void))block;

    最大并发数

    什么是并发数

    p同时执行的任务数
    p比如,同时开3个线程执行3个任务,并发数就是3

    最大并发数的相关方法

    - (NSInteger)maxConcurrentOperationCount;

    - (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

    队列的取消、暂停、恢复

    取消队列的所有操作

    - (void)cancelAllOperations;

    提示:也可以调用NSOperation的- (void)cancel方法取消单个操作

    暂停和恢复队列

    - (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列

    - (BOOL)isSuspended;

    操作优先级

    设置NSOperation在queue中的优先级,可以改变操作的执行优先级

    - (NSOperationQueuePriority)queuePriority;

    - (void)setQueuePriority:(NSOperationQueuePriority)p;

    优先级的取值

    pNSOperationQueuePriorityVeryLow = -8L,
    pNSOperationQueuePriorityLow = -4L,
    pNSOperationQueuePriorityNormal = 0,
    pNSOperationQueuePriorityHigh = 4,
    pNSOperationQueuePriorityVeryHigh = 8

    操作依赖

    NSOperation之间可以设置依赖来保证执行顺序

    p比如一定要让操作A执行完后,才能执行操作B,可以这么写

    [operationB addDependency:operationA]; // 操作B依赖于操作A

    可以在不同queue的NSOperation之间创建依赖关系

    操作的监听

    可以监听一个操作的执行完毕

    - (void (^)(void))completionBlock;

    - (void)setCompletionBlock:(void (^)(void))block;

    自定义NSOperation

    自定义NSOperation的步骤很简单

    p重写- (void)main方法,在里面实现想执行的任务
    p

    重写- (void)main方法的注意点

    p自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)
    p经常通过- (BOOL)isCancelled方法检测操作是否被取消,对取消做出响应

    自定义NSOperation下载图片思路

  • 相关阅读:
    Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
    Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
    Atitit 图像处理 灰度图片 灰度化的原理与实现
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    Atitit 实现java的linq 以及与stream api的比较
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库
    Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
    Atitit apache 和guava的反射工具
    atitit。企业的价值观 员工第一 vs 客户第一.docx
  • 原文地址:https://www.cnblogs.com/niexiaobo/p/4888696.html
Copyright © 2011-2022 走看看