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队列一起使用
- ios多线程
- iOS多线程
- iOS多线程
- iOS多线程
- 多线程ios
- IOS 多线程
- ios多线程
- ios 多线程
- IOS多线程
- IOS多线程
- iOS多线程
- iOS多线程
- ios 多线程
- iOS多线程
- IOS多线程
- ios多线程
- iOS 多线程
- iOS 多线程
- 阿里云ECS服务器php运行环境配置全过程
- 托管已有项目到码云
- 公众号目录
- caffe使用过程
- Ubuntu下Java组件入门环境部署
- iOS多线程
- 图像融合之泊松编辑(Poisson Editing)(1):简略语言概述算法
- 链表总结
- 一个网络请求调试工具
- 怎样在github上上传自己的源码
- iOS 多线程
- 性能测试工具操作数据库(八)-Jmeter与SQL Server
- adb input 命令输入文本功能介绍
- 工具方法,可以将指定的表单中的输入项目序列化为json数据