zoukankan      html  css  js  c++  java
  • iOS开发多线程编程2

    1.简介

    NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。

    NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:

    1> Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperation和NSBlockOperation

    2> 自定义子类继承NSOperation,实现内部相应的方法

    2.执行操作

    NSOperation调用start方法即可开始执行操作,NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行

    二、NSInvocationOperation

    1.简介

    基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类

    1. NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self  
    2.                                                                            selector:@selector(downloadImage:)  
    3.                                                                              object:kURL];

    2.创建并执行操作

    三、NSBlockOperation

    1.简介

    能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成

    通过addExecutionBlock方法添加block操作,得到的是并发执行那个

    即使是在operation开始执行之前。NSOperation类提供了取消operation的方法,但对于取消行为的处理需要程序自己去控制,如果operation被直接取消,那么可能就无法正确的释放之前分配的一些资源,所以通常情况下,运行中的operation在取消时,程序需要以正确的方式释放资源并退出。

    只要在operation运行中定期的在合适的位置调用isCancelled方法,并在当返回值为YES时直接return即可。在程序逻辑中,常见的正确调用isCancelled的位置包括:

    1. 在实际执行工作之前
    2. 在每个循环的执行体中,如果一次执行体耗时很长可酌情添加调用次数
    3. 程序相对容易终止的代码处。
    4. 执行Operation

      1 .将operation对象添加到操作队列

      这是执行operation对象的最简单的方法,操作队列属于NSOperatinQueue类。应用程序负责创建和维护操作队列,Application可以创建任意数量的操作队列,但实际上operation的的并行执行数量是有限制的。操作队列会和系统一起来限制operation的并发执行数量,以保持合理的系统负载。所以,创建额外的操作队列不意味着你可以执行额外的操作。

      NSOperationQueue设计上是用来并发执行operation,但可以通过强制措施来保证一次运行一个operation。setMaxConcurrentOperationCount:方法可以设置操作队列并行执行的最大数量。设置为1可以保证一次运行一个operation,但operation的执行顺序却仍依赖于其它因素,如operation的就绪状态,优先级设置。所以串行化操作队列与串行化的GCD转发队列不同。需要设置operation间的依赖关系来保证它们的执行顺序是你想要的。

      2 .手动执行Operation

      可以在没有操作队列的前提下手动执行operation,但需要一些前提条件。尤其是operation对象必须准备好运行,并保证是调用start方法来执行。

      一个operation只有在其isReady方法返回YES时才被认为是可运行的。isReady方法会被整合进NSOperation的依赖管理系统来保证operation的依赖状态。只有在依赖关系清楚后,operation才开始运行。

      在手动执行operation时,必须调用其start方法。start方法在正式执行你得代码之前会做几个安全性检测。默认的start方法会生成operation依赖关系所需的KVO通知。同时保证已取消的operation不会再执行,以及在operation没就绪就开始运行时抛出异常。

  • 相关阅读:
    对于匿名对象,内部类这块的理解
    final等关键字和代码块
    构造方法
    接口与多态的总结
    关于折半法查找的一些总结以及ArrayList类的总结
    关于冒泡法的总结(主要是格式问题了)
    java读取properties文件的几种方式(转载)
    JAVA导出EXCEL表格(转载)
    map遍历的四种方法
    Java集合源码分析(四)HashMap
  • 原文地址:https://www.cnblogs.com/WJJ-Dream/p/5809240.html
Copyright © 2011-2022 走看看