iOS多线程 相关概念
iOS多线程 相关概念
1. 进程:进程(process):是指在系统中正在独立运行的一个应用程序. 比如同时打开QQ, Xcode,系统就会分别启动两个进程
2. 线程:线程(thread):是程序的一段执行序列,是进程的一部分
2.1 线程的特点:
a.每一个进程都至少要有一个线程,可以有多个线程
b.适当数量线程能够提高程序的运行效率
2.2 线程越多越好呢?
a. iOS中主线程占用1M,子线程占用512KB
b. 程序设计更加复杂
3. 多线程: 一个进程中同时运行多个线程,称为多线程并发
多线程在iOS中的应用
3.1 一个ios程序启动的时候,默认会开启一个线程,该线程就是主线程
3.2 主线程作用:显示/刷新UI界面;处理UI事件(点击事件、拖拽事件、滚动事件等)
四种多线程技术:
一. Pthread
POSIX (Portabel Operation System Interface): 可移植操作系统接口
优点: 基于c语言的api;可编写多平台应用;使用方便
缺点: 可自定义的功能少
创建线程
````
//子线程调用逻辑函数
void *pthreadTask(void *data) {
//编写子线程相关逻辑
return 0;
}
//调用pthread子线程函数
void launchPthread() {
//1. 创建pthread_t
pthread_t pid;
//2. 创建线程
pthread_create(&pid, 0, pthreadTask, 0);
//3. 主线程相关逻辑
}
````
二. NSThread(不推荐使用)
1.优点:创建线程很方便
2.缺点:
1)需要自己管理线程的生命周期,线程同步,加锁、开锁
2) 管理多个线程比较非常困难
3.手动创建线程的三种方法
//方法一:NSThread实例方法创建线程
NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];
//方法二:NSThread类方法:直接创建线程并且开始运⾏行线程
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
//⽅法三:NSObject实例⽅方法隐式创建线程
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];
GCD(推荐使用)
特点:
1. 是基于C语言的底层接口
2. 使用block定义任务,使用起来灵活方便
3. 开发者不用直接跟线程打交道,只需要向队列中添加代码块即可
4. GCD在后端管理着一个线程池,集中管理线程
创建步骤
1.创建一个 dispatch_queue_t
dispatch_queue_t queue = dispatch_queue_create (“name”,NULL);
2.提交一个Block任务到队列中
dispatch_async(queue, ^{
// 异步执⾏的代码:网络下载,数据处理..
})
3.任何 UI 相关的操作都要回主队列中完成
dispatch_async(dispatch_get_main_queue, ^{
// 这⾥里写更新UI的代码
})
GCD其他用途
延时任务dispatch_after
1.准备好延时的时间变量dispatch_time_t
dispatch_queue_t queue = dispatch_queue_create (“name”,NULL);
2.准备好一个分发队列dispatch_queue_t
dispatch_queue_t queue = dispatch_get_main_queue();
3.将延时变量和分发队列传入dispatch_after函数
dispatch_after(delay, queue, ^{});
一次性任务dispatch_once
1.创建一个静态的GCD的单次任务变量dispatch_once_t
static dispatch_once_t onceToken;
2.将单任务变量和Block代码传入dispatch_once函数
dispatch_once(&onceToken, ^{});
NSOperation(推荐使用)
NSOperation进行多线程编程有两种方式(是并发编程的首选):
方式一: 使用NSOperation的两个子类:NSInvocationOperation和NSBlockOperation对线程 进行操作,这两个类的使用没有本质的区别,只是后者使用Block形式
方式二: 需要继承NSOperation类,并重写main方法(类似于Java中的java.lang.Runnable)
4. ios四种多线程技术
a. PThread: 支持多平台(c语言);效率高
1). 创建pthread_t
2). 创建线程:pthread_create(&pid, 0, pTask,0);
b. NSThread (不推荐使用):
1). 创建线程很方便
2). 缺点:需要手动创建;手动管理;线程同步;手动加锁、开锁
3). 三种创建线程方法:
1)). NSThread->实例方法:initWithTarget: 创建线程 —> 启动线程
2)). NSThread->类方法:detachNewThreadSelector
3)). NSObject->performSelectorInBackground(在后台运行 === 在字线程中运行)
4). 线程有优先级:0.0 ~ 1.0 (defalt: 0.5)
获取线程优先级方法:
+ (double) threadPriority;
设置线程优先级
+(BOOL)setThreadPriority:(double)p;
5). 获取/设置线程的名字
-(NSString *)name;
-(void)setName: (NSString *)n;
c. GCD
特点:
1)基于c语言
2)使用block定义任务,使用起来灵活
3)开发者不用直接和线程打交道,只需要在队列中添加代码逻辑即可
创建线程:
1). 创建一个dispatch_queue_t对象
2). 提交一个block任务到队列中
3). 讲ui相关的操作放回主线程
延时任务:
1). 创建延时变量dispatch_time_t
2). 创建一个分发队列dispatch_queue_t
3). 将延时变量和分发队列传入dispatch_after
一次性任务:
1). 创建一个静态的单任务变量dispatch_once_t
2). 将这个单任务变量和block任务传个dispatch_once
d. NSOperation & NSOperationQueue
NSOperation进行对线程编程有两种方式:
方式一:使用NSOperation的两个子类(NSInvocationOperation和NSBlockOperation)对线程进行操作,这两个子类的使用没有太大的区别,后者block形式
方式二:需要继承NSOperation类,并重写main方法
特点:
1)面向对象,基于GCD之上的一套oc的接口
2)不需要关心线程管理、数据同步问题,把精力放在执行代码的逻辑上
网络协议:
是网络上所有设备(网络服务器、计算机等)之间的通讯规则,它规定了通信时信息必须采用的格式和这些格式的意义。
http协议:
HyperText Transfer Protocol: 超文本协议
是用于www服务器传输超文本到本地浏览器的传输协议。
客户端(请求资源) ——> 服务器 —> 是否遵循http协议
1. —> 如果遵循 200—> 服务器告诉客户端 —> 允许访问我的资源(网页)—> 客户端的浏览器解析来自服务器的资源
2. —> 不遵循 —> 服务器告诉客户端(没有资源,请求失败,不遵循http协议)
Request: 请求 客户端 —>服务器
方法:get(获取 )put(更新) post(提交) delete(删除)
Response: 应答 服务器端返回的应答
iOS中的网络请求
NSURLSession(会话)的功能:
1. 通过url将数据下载到本地
2. 通过url将数据存储到内存
3. 将数据上传到服务器
4. 后台完成上述功能
样例:
1. 使用ios网络技术实现下载图片功能
2. 显示下载百分比
3. 断点续传
创建下载任务的步骤:
1. 创建NSURL对象
2. 根据这个url对象创建一个请求(request)
3. 调用单例的会话任务sharedSession
4. 在下载任务的回调函数(response)中进行相应的处理
a. 判定返回的状态码(return code)
b. 返回location是一个临时的文件夹,使用NSFileManger类的moveItem函数来保存到Documents文件夹下
5. 调用resume函数来发送请求