Grand Central Dispatch 笔记

Grand Central Dispatch 笔记

Concurrency and Application Design

Dispatch Queues

  • 可以 serially 或者 concurrently
  • 分类
    • serial dispatch queue - FIFO 并 一个个执行
    • concurrent dispatch queue - 并发
  • 提交给 dispatch queue 的 tasks 必须封装在 function 或者 block 对象中

Dispatch Sources

  • 用来异步处理特定的 system events
  • 必须封装在 block object 或者 function 中

Operation Queues

  • 相当于并发的 dispatch queue
  • NSOperationQueue实现
  • FIFO
  • 可以考虑 tasks 的 execution order
  • NSOperation类的一个实例
  • 可以使用 KVO notifications 来监测 task 的进度

Dispatch Queues

Dispatch Queues 的种类

Serial

  • Serial queues 根据 task 进去 queue 的顺序,一次只执行一个 task
  • 当前的 task 在一个独立的线程(thread)中执行,这个线程由 dispatch queue 控制,可以从一个 task 切换到另一个 task

Concurrent

  • Concurrent queues 可以并发一个或者多个 task
  • 启动 task 的顺序还是按照它假如 queue 的顺序
  • 所有的当前正在执行的 tasks 都被安排到独立的线程中
  • 这些线程由 dispatch queue 控制
  • task运行的数量是可变的,并且受到系统条件的影响
  • iOS5中,可以用DISPATCH_QUEUE_CONCURRENT来创建 queue,有4条 global concurrent queues 可以用来调用

Main dispatch queue

  • 是全局可用的serial queue
  • 用来为程式的 run loop工作
  • 在程式的 main thread 上运行

Implementing Tasks Using Blocks

  • blocks 的声明方式与方程指针的相似,block用^代替了*
  • 在 block 中,也可以传递参数以及存在返回值

      int x = 123;        int y = 456;        // Block declaration and assignment     void (^aBlock)(int) = ^(int z) {  // int = int z            printf("%d %d %d\n", x, y, z);      };      // Execute the block        aBlock(789);   // prints: 123 456 789
    

Create and Managing Dispatch Queues

Getting the Global Concurrent Dispatch Queues

  • multiple tasks run in parallel
  • first-in,first-out order,but may dequeue additional tasks before any previous tasks finish
  • as condition change, the number of tasks executed is variable
  • each application with four concurrent dispatch queues, they are global with different priority level

      dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    

Note: Thesecondargumenttothedispatch_get_global_queuefunctionisreservedforfuture expansion. For now, you should always pass 0 for this argument.

Creating Serial Dispatch Queues

  • only one task at a time
  • always pulls tasks from the head of the queue
  • protect a shared resource or mutable data structure

      dispatch_queue_t queue;     queue = dispatch_queue_create("com.example.MyQueue", NULL);
    
    • two parameters:the queue name and a set of queue attributes(reserved for future use and should be NULL)

Adding Tasks to a Queue

Feb 4th, 2015

Comments