iOS多线程

来源:互联网 发布:一句激励你的话知乎 编辑:程序博客网 时间:2024/06/05 17:03

1. 引入的异步技术有两个 GCD和Operation Queue


1.1 Dispatch Queue

按先进先出的顺序,串行或并发的执行任务

serial dispatch queue一次只能执行一次任务

concurrent dispatch queue则尽可能多的启动任务并发执行


1.2 Dispatch Sources


1.3 Operation Queues

dispatch queue总是按先进先出的顺序执行任务,而Operation Queues在确定任务执行顺序时,还会考虑其他因素。 最主要因素依赖等待

NSOperation是一个抽象基类,通常你需要自定义任务来执行任务

Operation objects会产生kvo通知,对于监控任务的进程非常有用

opertion queue总是并发的执行任务,你可以使用依赖,在需要时候确保顺序执行


2 Operation Queues

NSInvocationOperation 可以直接使用的类, 基于一个对象和selector创建operation object

NSBlockOperation 可以直接使用的类, 并发的执行一个或多个block对象

NSOperation 基类,用来自定义operation object实现


所有operation object都支持以下特性

支持建立依赖

支持可选的completion block,在operation的主任务完成后调用

支持使用kvo通知来监控operation的执行状态

支持operation优先级,从而影响执行顺序

支持取消,允许终止正在执行的任务


2.2

只需要将operations添加到operation queue就能实现并发。

当你提交非并发operation到operation queue时,queue会创建线程来运行你的操作,因此也能达到异步执行的目的


2.3 创建一个NSInvocationOperation对象

- (NSOperation *)taskWithData:(id)data {    NSInvocationOperation * theOP = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(myTaskMethod:) object:data];    return theOP;}- (void)myTaskMethod:(id)data {    // Perform the task}

2.4 创建一个NSBlockOperation对象

当NSBlockOperation对象执行时, 会把所有block提交到默认优先级的并发dispatch queue

NSBlockOperation对象等待所有block完成执行,最后标记自己已完成,因此可以使用block operation来跟踪一组执行中的block

    NSBlockOperation * theOP = [NSBlockOperation blockOperationWithBlock:^{        // Do some work.        NSLog(@"1. do some work");    }];        [theOP addExecutionBlock:^{        // DO some work.        NSLog(@"2. do some work");    }];

2.5自定义Operation对象

每个operation对象至少需要实现以下方法

自定义initization方法:将operation对象设置为已知状态

自定义main方法:执行你的任务


响应取消事件


为并发执行配置operations


维护kvo依从


2.6自定义一个Operation对象的执行行为

配置operation之间的依赖关系, 不能有环

配置依赖必须在运行operation和添加operation到queue之前进行


修改Operation执行优先级

优先级只能应用于相同的queue中的operations

优先级不能替代依赖关系


修改底层线程优先级

对于operation对象,你指定线程优先级为0.0-1.0之间某个数值, 0.0表示最低优先级, 1.0表示最高优先级, 默认0.5

要设置operation线程优先级, 必须在operation添加到queue之前设置


设置一个completion block


根据需要保留Operation对象的引用


2.8 为Operation对象确定一个适当的范围


2.9执行Operations

添加Operations到Operation Queue

可以添加一个operation

可以添加一组operations

可以直接添加block


虽然NSOperationQueue类设计用于并发执行Operations, 你也可以强制单个queue一次只能执行一个Operation 设置最大并发数


取消Operations

一旦添加到operation queue, queue就拥有了这个对象并且不能被删除, 唯一能做的事情是取消。

可以取消单个,也可以取消所有


等待Operations完成

可以使用waitUntilFinished方法等待operation完成, 通常应该避免编写这样的代码,会阻塞线程

除了等待单个operation完成, 也可以等待一个queue中的所有做操


挂起和继续Queue

挂起一个queue不会导致正在执行的Operation任务中途暂停


3 Dispatch Queues

GCD提供了几种dispatch queues

串行

并发:你不能创建并发的dispatch queues, 系统已经定义好全局并发queues

Main dispatch queue


把两个任务添加到串行queue,则可以确保两个任务对共享资源的访问顺序


3.2 Queue相关的技术

Dispatch group : 用于监控一组block对象完成。Group提供了一个非常有用的同步机制

Dispatch semaphore : 类似传统的信号量, 使用信号量可以实现对有限资源的访问控制

Dispatch source:


3.3 使用Block实现任务


3.4 创建和管理Dispatch Queue

获得全局并发Dispatch Queue

系统给每个应用提供了三个并发dispatch queue


创建串行Dispatch Queue

按特定顺序执行时, 就需要使用串行Dispatch Queue, 串行queue每次只能执行一个任务。 可以使用串行queue替代锁,保护共享资源

串行queue确保任务按可预测的顺序执行,而且你异步提交任务到串行queue,就永远不会产生死锁


dispatch_queue_create函数创建串行queue


运行时获得公共Queue

使用dispatch_get_current_queue函数

使用dispatch_get_main_queue函数

使用dispatch_get_global_queue函数获得共享的并发queue


在Queue中存储自定义上下文信息


为Queue提供一个清理函数


3.5添加任务到Queue

添加单个任务到Queue


任务完成时执行Completion Block


并发地执行Loop Iteration


在主线程中执行任务


任务中使用Objectivce-C对象


3.6挂起和继续queue

使用dispatch_suspend函数可以挂起一个dispatch queue


3.7 使用dispatch Semaphore 控制有限资源的使用

可以使用信号量来控制同时访问这个资源的数量


3.8 等待queue中的一组任务

Dispatch group用来阻塞一个线程,直到一个或多个任务完成执行


3.9 Dispatch Queue和线程安全性


4 Dispatch Sources


毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行,该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用











0 0
原创粉丝点击