zoukankan      html  css  js  c++  java
  • iOS开发之---多线程技术

    iOS支持多个层次的多线程编程,层次越高抽象程度越高,使用起来也越方便,也是苹果推荐的方式。

    • Thread:最低抽象层次的,线程的管理、线程锁的设置与释放等都需要开发人员自己来负责,使用NSThread类来创建和管理线程。
    • Cocoa Operations:通过NSOperation类来管理线程。NSOperation是一个抽象基类,iOS提供了两个默认实现:NSInvocationOperation和NSBlockOperation。
    • Grand Central Dispatch(GCD):iOS 4开始支持GCD,它提供了一个全新的API,可以将应用程序需要执行的工作拆分为可以分散在多个线程多个cpu上更小的块。这个新API大部分使用程序块(Block)来访问。使用GCD,开发者需要做的唯一一件事就是定义需要执行的任务,并 把任务添加到合适的派遣队列(Dispatch Queue)中。GCD将负责创建线程,并将任务调度到合适的线程中。GCD技术使得线程管理已经成为系统的一部分,提供一个友好的任务管理和执行的方法,和传统的NSThread管理相比效率更高。

    本节重点介绍GCD的使用:

    • GCD派遣队列:是一个基于C语言的技术,队列可以按照顺序执行任务也可以同步执行任务,但是所有在队列里面的任务均按照“先进先出”的顺序。提交给派遣队列的任务必须封装成一个函数或者程序块(Block)。
    1. 顺序队列:
    2. 并发队列:也称全局派遣队列
    3. 主队列:是一个在应用程序的主队列,这个队列和应用程序的运行循环交错执行

    几个例子:

    1、顺序队列异步执行

    异步不阻塞

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"队列开始执行....");
        dispatch_queue_t queue ;
        queue = dispatch_queue_create("iphone.book.queue", NULL);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"队列之中运行...");
        });
        NSLog(@"队列之后运行....");
    }

    2、顺序队列同步执行:

    同步阻塞

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"队列开始执行....");
        dispatch_queue_t queue ;
        queue = dispatch_queue_create("iphone.book.queue", NULL);
        dispatch_sync(queue, ^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"队列之中运行...");
        });
        NSLog(@"队列之后运行....");
    }

    3、并发队列异步执行

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"队列开始执行....");
        dispatch_queue_t queue ;
        queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"队列之中第一个任务运行...");
        });
        
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"队列之中第二个任务运行...");
        });
        
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"队列之中第三个任务运行...");
        });
        
        NSLog(@"队列之后运行....");
    }

    4、主线程队列

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"队列开始执行....");
        dispatch_queue_t queue ;
        queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
            lblInfo.text = 计算结果
        });
        
        NSLog(@"队列之后运行....");
    }

    【注】:异步执行代码的其它方法:

    除了通过多线程的方式进行异步代码执行外,还有其它方式来进行异步操作

    1、performSelector: withObject: afterDelay:

    该方法是NSRunLoop对象针对NSObject类添加的类别(extension),因此基本所有的类都能执行该方法。

    2、performSelectorOnMainThread: withObject: waitUntilDone:

    该方法是NSThread类为NSObject类添加的方法。

    3、scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

    通过NSTimer类的类方法,在一定的时间异步执行selector指定的方法。

  • 相关阅读:
    浅析Vue3相关基础知识:Vue3应用配置、重写的vmodel、emits 选项、getCurrentInstance()获取实例、采用mitt实现全局通讯、vuerouter的新特性
    Vue3结合TS项目开发实践:Composition API的风格理念、关注点分离、如何组织TS进行项目开发(采用声明文件来管理接口及所需类型/目录结构推荐)
    TypeScript类型守卫、联合类型、交叉类型
    Android开发历程_14(广播机制)
    OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
    OpenGL_Qt学习笔记之_06(纹理滤波、光照和色彩融合)
    Qt学习之路_12(简易数据管理系统)
    特征点检测学习_2(surf算法)
    Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)
    PCA算法学习_1(OpenCV中PCA实现人脸降维)
  • 原文地址:https://www.cnblogs.com/yaoxc/p/3730393.html
Copyright © 2011-2022 走看看