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指定的方法。

  • 相关阅读:
    软件工程实践第三次作业——原型设计
    第三次作业补充
    软件工程实践之词频统计
    软工实践第一次作业
    B*树索引结构和内部管理(转)
    MySQL索引背后的数据结构及算法原理(转)
    Java编程军规
    差分隐私学习三:实现机制
    万能头文件#include <bits/stdc++.h>
    微信小程序-flex布局中align-items和align-self区别
  • 原文地址:https://www.cnblogs.com/yaoxc/p/3730393.html
Copyright © 2011-2022 走看看