多线程开发 - GCD的使用

来源:互联网 发布:amaze ui 知乎 编辑:程序博客网 时间:2024/06/06 00:17
1.  读取网络数据,IO和数据库操作的时候 dispatch_async

用于监听耗时事件是否完成

- (void)downloadOneImage:(NSURL *)url{    url = [NSURL URLWithString:@"http://f11.topit.me/l/201012/23/12931084503799.jpg"];    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        NSData *data = [NSData dataWithContentsOfURL:url];        UIImage *image = [UIImage imageWithData:data];        dispatch_async(dispatch_get_main_queue(), ^{            self.imageView.image = image;        });    });}

2. 如果遇到一系列的任务

   用dispatch_sync 方法串行执行时会出现效率低下的情况,同时dispatch_async 是非阻塞的,不能确定任务执行完成的时间
   于是使用GCD提供的dispatch_group_t ,管理一组任务的下载,当所有任务下载完成调用

- (void)downloadGroupImage{    // 创建全局队列    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, ^{        // 延迟3秒        [NSThread sleepForTimeInterval:3];        NSLog(@"image1");    });        dispatch_group_async(group, queue, ^{        [NSThread sleepForTimeInterval:3];        NSLog(@"image2");    });        dispatch_group_async(group, queue, ^{        [NSThread sleepForTimeInterval:3];        NSLog(@"image3");    });        dispatch_group_notify(group, dispatch_get_main_queue(), ^{                NSLog(@"finish");    });}

3. 由于在使用dispatch_async()函数提交并行任务时,不能确定执行顺序,如果需要确定某些任务的运行位置就需要用到dispatch_barrier_async()函数
比如

    dispatch_queue_t queue = dispatch_get_current_queue();    dispatch_async(queue, ^{        NSLog(@"1");    });    dispatch_async(queue, ^{        NSLog(@"2");    });    dispatch_barrier_async(queue, ^{        NSLog(@"3");    });    dispatch_async(queue, ^{        NSLog(@"4");    });    dispatch_async(queue, ^{        NSLog(@"5");    });打印信息2014-11-04 17:18:04.920 下载[2859:60b] block12014-11-04 17:18:04.921 下载[2859:60b] block22014-11-04 17:18:04.922 下载[2859:60b] block32014-11-04 17:18:04.922 下载[2859:60b] block42014-11-04 17:18:04.923 下载[2859:60b] block

在这个函数中,首先执行1.2 当1.2执行完毕后 4.5才能够被执行

4. 如果需要执行某行代码N次使用 dispatch_apply

dispatch_apply(size_t iterations // 总共执行次数, dispatch_queue_t queue //执行的队列, ^(size_t)block //执行的代码块 size_t 当前执行的次数) 




0 0
原创粉丝点击