zoukankan      html  css  js  c++  java
  • IOS线程操作(3)

    采用CGD更有效的比前两个(它被认为是如此,有兴趣的同学可以去试试)。

    这是推荐的方式来使用苹果的比较。
    GCD它是Grand Central Dispatch缩写,这是一组并行编程C介面。

    GCD是基于Objective-C的Block的特性开发的,主要的业务逻辑和NSOperation非常像。都是加入一个任务到一个队列,由系统来负责线程的生成和调度。由于直接使用Block。所以使用起来非常是方便。减少了多线程开发的门槛.

    还是前两节下载图片的样例,让我们看一下使用GCD模式该如何做。

    #import "ViewController.h"
    
    #define IMAGE_PATH @"https://www.baidu.com/img/bdlogo.png"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *mImage;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
            NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:IMAGE_PATH]];
            UIImage *image = [[UIImage alloc] initWithData:imageData];
            //回到主线程
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.mImage setImage:image];
            });
        });
    }

    是不是要简洁得多,GCD会自己主动帮我们创建消息队列。不须要我们再去手动创建和管理。
    系统给每个应用程序提供了三个concurrent dispatch queues。

    这三个并发调度队列是全局的,它们仅仅有优先级的不同。由于是全局的,我们不须要去创建。我们仅仅须要通过使用函数dispath_get_global_queue去得到队列,例如以下:

    dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   

    2、关于dispatch_group_async的使用
    dispatch_group_async能够实现监听一组任务是否完毕,完毕后得到通知运行其它的操作。

    这种方法非常实用,比方你运行三个下载任务,当三个任务都下载完毕后你才通知界面说完毕的了。以下是一段样例代码:

     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_group_t group =  dispatch_group_create();
        dispatch_group_async(group, queue,^{
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"1.0");
        });
         dispatch_group_async(group, queue,^{
            [NSThread sleepForTimeInterval:2.0];
            NSLog(@"2.0");
        });
         dispatch_group_async(group, queue,^{
            [NSThread sleepForTimeInterval:3.0];
            NSLog(@"3.0");
        });
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"dispatch_group_async");
        });

    打印结果:
    2015-06-03 12:42:46.673 IOS多线程[1706:138779] 1.0
    2015-06-03 12:42:47.671 IOS多线程[1706:138782] 2.0
    2015-06-03 12:42:48.672 IOS多线程[1706:138787] 3.0
    2015-06-03 12:42:48.672 IOS多线程[1706:138679] dispatch_group_async

    3、dispatch_barrier_async
    我们能够通过

    dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
    

    方法来生成自己定义的queue ,label參数。理论上是能够使用不论什么自己定义值的。我们一般使用倒序的程序路径名。


    看以下的代码:

        dispatch_queue_t queue = dispatch_queue_create("asd", DISPATCH_QUEUE_SERIAL);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:2];
            NSLog(@"1");
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:4];
            NSLog(@"2");
        });
        dispatch_barrier_async(queue, ^{
            NSLog(@"3");
        });
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:1];
            NSLog(@"4");
        });

    打印结果:
    2015-06-03 13:05:37.753 IOS多线程[1989:151430] 1
    2015-06-03 13:05:41.757 IOS多线程[1989:151430] 2
    2015-06-03 13:05:45.763 IOS多线程[1989:151430] 3
    2015-06-03 13:05:46.764 IOS多线程[1989:151430] 4

    大家能够看到 打印结果是依照顺序去打印的。也就是说这是在子线程中去进行的一个串行操作。dispatch_barrier_async是在前面的任务运行结束后它才运行,并且它后面的任务等它运行完毕之后才会运行

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    结对作业(1)--疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)疫情统计程序
    最长回文
    吉哥系列故事——完美队形II ——Manacher算法
    友情链接
    代码互改——第二次个人编程作业
    汉字编程——第一次个人编程作业
    谈谈自己
    OO第一次博客
    OO第一单元作业总结
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4947247.html
Copyright © 2011-2022 走看看