文档章节

Objective-C-GCD

BKF_
 BKF_
发布于 2016/03/03 12:40
字数 646
阅读 279
收藏 0
  1. 队列 & 线程的执行方式(任务)
        任务:block,消息等函数块,他是由线程执行的。
        线程执行任务的方式:
            同步线程:当前线程a只能执行完事件A才能执行任务B。
            异步线程:当前线程a执行A的时候又开了个线程b,执行任务B
        队列:存储任务
            串行队列:一个任务(block)接着一个任务的出队。一般由一个线程处理这一个队列
            并发队列:一次有多个任务出队,由多个线程处理。使用异步线程执行。

                



2.GCD:
    线程执行方式:
        同步:dispatch_sync
        异步:dispatch_async
    队列:
        串行:串行队列,dispatch_queue_create,主队列dispatch_get_main_queue
        并发:全局队列,dispatch_get_global_queue

        mainThread <--->mainQueue



3.GCD线程间通信图:



4.

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"download:%@", [NSThread currentThread]);
    NSURL *url = [NSURL URLWithString:@"http://pic.nipic.com/2007-12-06/2007126205543511_2.jpg"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    NSLog(@"image:%@", image);
    
    //通知主线程更新 UI
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"updateUI:%@", [NSThread currentThread]);
        self.imgView.image = image;
    });
});

       output

2016-03-03 12:40:00.368 gcdThread[8835:87857] download:<NSThread: 0x7fa57b532800>{number = 2, name = (null)}
2016-03-03 12:40:00.952 gcdThread[8835:87857] image:<UIImage: 0x7fa57d80d0c0>, {1024, 375}
2016-03-03 12:40:00.952 gcdThread[8835:87600] updateUI:<NSThread: 0x7fa57b605170>{number = 1, name = main}


5.GCD 队列组
    串行队列中,任务执行时一个接着一个的。任务间通信是线性的。B任务可以等待A任务完成后拿到A任务的数据。
    在并行队列中,任务执行时异步的。需要靠通知(线程间提前做好约定,当这个约定实现了,才会传递数据)。dispatch_group 组操作作为任务之间通信的一种约定

- (void) groupMultiDownload
{
    __block UIImage *img1, *img2;
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_group_async(group, queue, ^{
        NSURL *url1 = [NSURL URLWithString:@"http://pic8.nipic.com/20100731/2531170_101711635627_2.jpg"];
        NSData *data1 = [NSData dataWithContentsOfURL:url1];
        NSLog(@"download1:%@", [NSThread currentThread]);
        img1 = [UIImage imageWithData:data1];
    });
    
    dispatch_group_async(group, queue, ^{
        NSURL *url2 = [NSURL URLWithString:@"http://pic9.nipic.com/20100813/2531170_083235193107_2.jpg"];
        NSLog(@"download2:%@", [NSThread currentThread]);
        NSData *data2 = [NSData dataWithContentsOfURL:url2];
        img2 = [UIImage imageWithData:data2];
    });
    
    //队列组中所有任务完成后 执行 notify
    dispatch_group_notify(group, queue, ^{
        NSLog(@"download finish:%@", [NSThread currentThread]);
        UIGraphicsBeginImageContextWithOptions(img1.size, NO, 0.0);
        [img1 drawInRect:CGRectMake(0, 0, img1.size.width, img1.size.height)];
        [img2 drawInRect:CGRectMake(0, 0, img2.size.width, img2.size.height)];
        
        UIImage *fullImg = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        dispatch_async(dispatch_get_main_queue(), ^{
            _imgView.image = fullImg;
        });
    });
}


6.延迟执行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
    NSLog(@"------task------%@", [NSThread currentThread]);
});//使用的是 全局并发队列,所以会自动开启一个子线程,执行block中的内容

7.代码一次执行:代码在程序运行阶段只会被执行一次

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSLog(@"----once");
    HMImageDownloader *downloader = [[HMImageDownloader alloc] init];
    [downloader download];
});

PS:使用 gcd实现单例模式

© 著作权归作者所有

共有 人打赏支持
BKF_
粉丝 1
博文 21
码字总数 4291
作品 0
广州
私信 提问
iOS GCD~performSelector、dispatch_once、NSOperation总结

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、使用GCD 替代 performSelector 系列方法 NSObject 的 performSelector 系列方法有很多限制。传给要执行的方法的参数的数量是有限制的,也没...

石虎132
2017/12/05
0
0
Effective Objective-C Notes:GCD 实现同步锁

本文名为《GCD 实现同步锁》,内容不止于锁。文章试图通过 GCD 同步锁的问题,尽量往外延伸扩展,以讲解更多 GCD 同步机制的内容。 引语:线程安全问题 如果一段代码所在的进程中有多个线程在...

goodlook
2016/04/04
46
0
iOS中动态更新补丁策略JSPatch运用基础二

iOS中动态更新补丁策略JSPatch运用基础二 一、引言 上篇博客中介绍了iOS开发中JSPatch引擎进行动态热修复的一些基础功能,其中包括向Objective-C类中添加类方法与成员方法、添加临时成员变量...

珲少
2016/03/30
265
0
iOS OS X 和 iOS 中的多线程技术-1

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念 多线程的目的是,通过并发执行提高 CPU 的使用效率,进而提供程序运行效率。 OS X 和 iOS 是多线程操作系统,它们追随 UNIX 系统使用...

石虎132
2017/11/21
0
0
iOS OS X 和 iOS 中的多线程技术-4 (GCD)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、GCD GCD(Grand Central Dispatch)是 Apple 公司为了提高 OS X 和 iOS 系统在多核处理器上运行并行代码的能力而开发的一系列相关技术,它...

石虎132
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安卓的切图规范

Android UI 切图命名规范、标注规范及单位描述 很多UI设计师做APP切图都会有两套,一套是Android的,一套是IOS的。IOS我这边暂不作讲解,因为我本人也不是开发IOS。这里整理一下我在Android...

mo311
32分钟前
2
0
深度剖析阿里巴巴对Flink的优化与改进

摘要: 作者 | 阿里巴巴实时计算团队 导读:随着人工智能时代的降临,数据量的爆发,阿里巴巴的商品数据处理就经常需要面对增量和全量两套不同的业务流程问题,所以阿里巴巴就在想:能不能有...

阿里云官方博客
32分钟前
2
0
Dubbo基础介绍

Dubbo是一个常用的分布式服务框架, 它致力于提供高性能、透明化的RPC远程服务方案。 学习Dubbo有助于提高企业级应用的开发效率,以及可通过简单的配置就可以实现负载均衡,提高服务的效率。...

Java搬砖工程师
44分钟前
4
0
VBS 自动登陆

1.关于网页元素属性 IE浏览器打开网页时,有很多元素,比如说一个文本框,一个按键等。每个元素都会有对应的“name”、“ID”,“style”,“class”等属性。 其中的“ID”和“name”属性是我...

宝贝女儿
48分钟前
1
0
GO 文件相关操作

package mainimport("fmt""os""bufio""io""io/ioutil")type ChartCount struct{Chct intSpacect intNumberct intOtherct int}func main() {file,err := os.Open......

汤汤圆圆
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部