美文网首页
iOS多线程 相关概念

iOS多线程 相关概念

作者: smile丽语 | 来源:发表于2015-05-31 21:28 被阅读140次

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

    相关文章

      网友评论

          本文标题:iOS多线程 相关概念

          本文链接:https://www.haomeiwen.com/subject/pxqdqttx.html