iOS多线程 相关概念

2015-05-31  本文已影响140人  smile丽语

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函数来发送请求

上一篇下一篇

猜你喜欢

热点阅读