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是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。