iOS中多线程编程
来源:互联网 发布:起凡刷通宝软件 编辑:程序博客网 时间:2024/04/18 10:47
要了解多线程, 必须先知道程序,进程和线程的概念
程序: 由源代码生成的可执行应用, 是静态的
进程: 为了反映程序并发执行的过程, 引入了进程的概念, 进程就是程序运行的过程,它可以申请和拥有系统的资源, 负责资源的调度
线程: 是程序执行的最小单元, 负责代码的执行, 一个进程由一个或多个线程组成, 每个进程至少包含一个线程,这个线程叫作主线程
多线程:一个程序可以拥有多个线程,iOS中可以根据需要自己开辟新的线程, 相对主线程来说这些线程叫做子线程
多线程的优点:
1. 在进行大量运算的时候如果用单线程, 则会影响主线程的执行,用多线程技术,则可以解决这个问题,大大加快程序运行的速度
2. 可以把执行时间长的任务放到后台处理
3. 在一些需要等待的任务(如: 用户输入)中可以释放一些内存资源
缺点:
1. 如果线程特别多的情况下可能会影响性能, 因为操作系统需要来回切换
2. 线程越多占用的内存资源越大
iOS中使用多线程的场景:
1. 需要大量运算的使用,如: 循环次数特大的时候
2. 大量的数据读取 如: 读取本地数据, 查询数据库中的所有数据
3. 网络同步请求
iOS中如何使用多线程:
常用的类: NSThread NSOperationQueue NSBlockOperation NSObject GDB
NSThread:
创建NSThread的两种方法:
1. 需要手动调用start方法开启线程
NSThread *thread = [[NSThreadalloc] initWithTarget:self selector:@selector(calculator) object:nil];
[threadstart];
2. 自动调用start方法开启线程
[NSThreaddetachNewThreadSelector:@selector(calculator)toTarget:selfwithObject:nil];
NSOperation 和 NSOperationQueue
NSOperation是抽象类,不能直接使用, 只能使用它的子类,
使用: 1. 在子类中重新父类的main方法,创建子类的对象,调用start方法,会自动调用main方法 (main方法中实现子线程要实现的代码)
2. 创建NSOperationQueue对象, 将NSOperation子类的对象加入到队列中, 会自动调用start方法启动线程 (此时不能再手动调用start方法)
NSBlockOperation:
NSBlockOperation *blockOper = [NSBlockOperationblockOperationWithBlock:^{
// 此处为多线程要执行的代码
}];
NSObject:
self performSelectorInBackground:<#(SEL)#> withObject:<#(id)#>
GDB:本质上就是一个函数,一般是一个block函数 性能更高,功能强大
GDB中有两种队列
1. 同步队列
创建一个同步线程队列
dispatch_queue_t queue = dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);
异步执行同步线程队列
dispatch_queue_async(queue,^{
// 要执行的多线程代码
// iOS多线程中, 所有会修改UI界面的代码全部要在主线程中执行, 不能在子线程中执行, 要定义或修改控件, 要返回主线程
// 得到主线程
dispatch_async(dispatch_get_main_queue(), ^{
// 这里写主线程要执行的代码
});
});
2. 并发队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 要执行的多线程代码
dispatch_async(dispatch_get_main_queue(), ^{
// 这里写主线程要执行的代码
});
});
需要注意的地方:
1. 在我们手动创建的子线程中, 执行多线程代码的地方要手动加入自动释放池
2. 不能直接使用NSOperation方法,只能使用它的子类
3. 不能在子线程中写修改UI的代码
- iOS中多线程编程
- iOS中多线程编程示例【code】
- iOS多线程编程指南
- IOS多线程编程指南
- [ios]多线程编程指南
- ios多线程编程
- iOS多线程编程
- iOS多线程编程
- iOS多线程编程指南
- iOS多线程编程
- IOS多线程编程
- iOS多线程编程
- IOS多线程编程指南
- iOS多线程编程
- 浅谈iOS多线程编程
- IOS多线程编程
- iOS多线程编程技术
- iOS中的多线程编程
- 关于我的开源项目RedisFile讲解 一
- 打开别人的android时报错缺少android环境的解决办法
- iOS AES 与SHA256加密字符串
- Solr的一些查询参数
- 总结:自动生成网页截图(Screenshot)方法
- iOS中多线程编程
- [C++]LeetCode: 53 Unique Binary Search Trees
- java连接oracle,完全正确却没有数据
- 用Jmdns的注册服务、方法的使用
- Android NDK开发起步Hello Jni 及NDK开发环境搭建
- cocos2d-x多分辨率适配方案:setDesignResolutionSize详解
- 模板:<bits/_Stack.h>
- write drain
- IOS中的本地存储