首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS开发——GCD在Swift变脸

Xcode8正式发布后,Swift3也随即发布,为了跟上苹果这艘大船脚步,赶紧逼着自己看文档哦。...在看文档过程,发现GCD变化跟OC相比简直都要不认识了,赶紧写个文章总结下,顺手复习下GCD死锁概念,死锁总结发布在另一篇文章里了。...取消过去接口 说起 GCD, 大家肯定回想起类似 dispatch_async 这样语法。 GCD 这个语法模式无论是和 Objc 还是 Swift 整体风格都不太搭调。...所以 Swift 3 对它语法进行了彻底改写。...比如最常用,在一个异步队列读取数据, 然后再返回主线程更新 UI, 这种操作在新 Swift 语法是这样: DispatchQueue.global().async { DispatchQueue.main.async

2.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

iOS——GCD死锁案例

串行与并行 在使用GCD时候,我们会把需要处理任务放到Block,然后将任务追加到相应队列里面,这个队列,叫做Dispatch Queue。...死锁具体案例 接下来所有的案例代码,我都会用Swift3语言重写一遍,为了帮助自己加深对Swift3语言理解。...从dispatch_get_global_queue可以看出,任务2被加入到了全局并行队列,当并行队列执行完任务2以后,返回到主队列,继续执行任务3。...所以,先执行任务1,然后将异步线程任务加入到Global Queue,因为异步线程,所以任务5不用等待,结果就是2和5输出顺序不一定。 然后再看异步线程任务执行顺序。...总结 在总结完这些GCD死锁情况以后,我觉得脑子里关于GCD死锁概念也逐渐清晰了。以后在项目中也会运用时候也会更加注意。

1.9K30

多线程和GCD

vs Grand Central Dispatch 这里主要介绍GCD GCD GCD全称是Grand Central Dispatch,纯c语言提供。...GCD中有两个核心概念: 任务:执行什么操作 队列:用来存放任务 将任务添加到队列GCD会自动将队列任务取出,放到对应线程执行。...自带一种特殊串行队列,放在主队列任务,都会放到主线程执行 获取并发队列: GCD默认已经提供了全局并发队列,供整个应用使用,不需要手动创建 dispatch_queue_t dispatch_get_global_queue...在串行队列只开启一条线程 在并发队列开启多条线程 主队列 主队列是和主线程相关联队列,主队列是GCD自带一种特殊串行队列,放在主队列任务,都会放到主线程执行。...dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执⾏耗时异步操作

1.1K10

iOS 多线程 - Operation

(在 OC ,还有一个是NSInvocationOperation,但在 Swift ,该子类已经在 Swift4 里去掉,想必去掉原因大家也很容易理解,因为 Swift 语言本身就不推荐 selector...这种方式相对于后面出现GCD底层线程池而言,效率就很低,所以在 Mac OS 10.5 以及 iOS 2 开始便对NSOpertion底层在基于GCD基础上进行完全重写,利用GCD相关特性提高性能并提供了一些新功能...GCD VS Operation 使用 GCD 还是使用 Operation 这个问题其实在社区已经争论了很久,从斯坦福大学 CS193p 课程推荐使用 GCD,到 WWDC 2012 时演讲者推荐使用...1、从两者所在层次来讲:GCD 底层是 C 语言 API,而 Operation 是 GCD 基础上更高层次抽象,那 GCD 相对 Operation 来说肯定是又快又轻。...NSOperation vs.

92230

《Objective-C-高级编程》干货三部曲(三):GCD

我们知道在iOS开发,一共有四种多线程技术:pthread,NSThread,GCD,NSOperation: 前两者是面向线程开发多线程技术,需要开发者自己去维护线程生命周期,比较繁琐。...有一个常见例子可以充分体现二者使用方法: //获取全局并发队列进行耗时操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT...如果预处理任务需要并发执行:需要使用dispatch_group函数,将这些预处理block追加到global dispatch queue。...[40905:3057253] 任务3 gcd_demo[40905:3057237] 任务4 gcd_demo[40905:3057237] 最后任务 因为这些预处理任务都是追加到global dispatch...queue,所以这些任务执行任务顺序是不定

88840

GCD概念和基本使用GCD概念和基本使用

1、GCD简介 全称是 Grand Central Dispatch; 纯 C 语言,提供了非常多强大函数; GCD是非常高效多线程开发方式,它并不是Cocoa框架一部分 1.1 GCD优势 GCD...是苹果公司为多核并行运算提出解决方案; GCD 会自动利用更多CPU内核(比如双核、四核) GCD 会自动管理线程生命周期(创建线程、调度任务、销毁线程) 总结:将任务添加到队列,并且指定执行任务函数...1.2 GCD函数 同步函数 通过dispatch_sync(queue , {})获取; 必须等待当前语句执行完毕,才会执行下一条语句; 不会开启其他线程,就在当前线程完成任务; 异步函数...()获取; 专⻔用来在主线程上调度任务串行队列; 全局并发队列 为了方便程序员使用,苹果提供了全局队列dispatch_get_global_queue(0, 0) 全局队列是并发队列,包含四个优先级...会产生多条线程; 2.5 GCD线程间通信 // 异步 dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 耗时操作放在这里 [NSThread

98320

iOS多线程 - GCD

二、任务和队列 GCD 中有 2 个核心概念 任务:执行什么操作 队列:用来存放任务 GCD 使用就 2 个步骤 定制任务 确定想做事情 *将任务添加到队列 GCD 会自动将队列任务取出...; 用异步方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 同步和异步区别 同步:只能在当前线程执行任务...各队列之间比较 八、GCD 线程间通信 //比如下载代码 dispatch_async(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0, ^{ //执行耗时异步操作...常用函数 1.执行任务 GCD 还有个用来执行任务函数: dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block...,可以考虑用队列组 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue

68320

iOS--多线程之GCD

这个库,这个调度库包含了GCD所有的东西,但任何IOS程序,默认就加载了这个库,在程序运行过程中会动态加载这个库,不需要我们手动导入。...(2)GCD是纯C语言,因此我们在编写GCD相关代码时候,面对函数,而不是方法。 (3)GCD函数大多数都以dispatch开头。...二、任务和队列 1.GCD中有2个核心概念 (1)任务:执行什么操作 (2)队列:用来存放任务 2.GCD使用就2个步骤 (1)定制任务 (2)确定想做事情 将任务添加到队列GCD会自动将队列任务取出...,再执行下一个任务 3.并发队列 DISPATCH_QUEUE_CONCURRENT GCD默认已经提供了全局并发队列,供整个应用使用,不需要手动创建 使用dispatch_get_global_queue...(2)使用主队列(跟主线程相关联队列) 在主队列执行同步任务,会发生死循环,任务无法往下执行 主队列是GCD自带一种特殊串行队列,放在主队列任务,都会放到主线程执行 使用dispatch_get_main_queue

661110

多线程—GCD

将任务添加到队列 GCD会自动将==队列====任务==取出,放到对应==线程==执行; 任务取出遵循对象==FIFO原则:先进先出,后进后出== ==画图分析== 程序员要做,将任务添加到队列...执行任务方法:同步/异步 同步:一个任务没有结束,就不会执行下一个任务 异步:不用等待任务执行完毕,就会执行下一个任务 GCD有一个“线程池”; GCD同步调度任务时,会拿出1根线程,让它执行队列任务...;当其中线程执行任务完毕后,再去队列按照FIFO原则获取任务; 图1:同步线程图例 图2:异步线程图例 ==实例demo 001GCD代码演示== 在viewController touchBegain...(q,task); } 线程间通讯 GCD之间线程通讯 -(void)gcdDemo3 { //指定任务执行方法 -- 异步 dispatch_async(dispatch_get_global_queue...获取网络图片 //异步执行 dispatch_async(dispatch_get_global_queue(0,0),^{ NSURL *url = [NSURL URLWithString

35230

OC实现锁

熟悉多线程开发同学对锁肯定不陌生,但是OC如何实现锁呢?给大家科普一下。   ...synchronized关键字构建锁 当然在Objective-C你还可以用@synchronized指令快速实现锁: //主线程 TestObj *obj = [[TestObj alloc]...(obj){ [obj method1]; sleep(10); } }); //线程2 dispatch_async(dispatch_get_global_queue...为该锁唯一标识,只有当标识相同时,才为满足互斥,如果线程2@synchronized(obj)改为@synchronized(other),刚线程2就不会被阻塞,@synchronized指令实现锁优点就是我们不需要在代码显式创建锁对象...3.使用GCD来实现”锁” 以上代码构建多线程我们就已经用到了GCDdispatch_async方法,其实在GCD也已经提供了一种信号机制,使用它我们也可以来构建一把”锁”(从本质意义上讲,信号量与锁是有区别

65960

iOS 多线程:『GCD』详尽总结(一)

本文用来介绍 iOS 多线程 GCD 相关知识以及使用方法。这大概是史上最详细、清晰关于 GCD 详细讲解+总结文章了。通过本文,您将了解到: 1. GCD 简介 2....GCD 任务和队列 学习 GCD 之前,先来了解 GCD 两个核心概念:任务和队列。 任务:就是执行操作意思,换句话说就是你在线程执行那段代码。在 GCD 是放在 block 。...异步执行(async): 异步添加任务到指定队列,它不会做任何等待,可以继续执行任务。 可以在新线程执行任务,具备开启新线程能力。 举个简单例子:你要打电话给小明和小白。...// 主队列获取方法 dispatch_queue_t queue = dispatch_get_main_queue(); 对于并发队列,GCD 默认提供了全局并发队列(Global Dispatch...; 3.2 任务创建方法 GCD 提供了同步执行任务创建方法dispatch_sync和异步执行任务创建方法dispatch_async

50950

关于GCD同步组实现多个异步线程同步执行注意点

、dispatch_group_t与dispatch_group_notify 组合来实现 比如这样: 将几个线程加入到group, 然后利用group_notify来执行最后要做动作 - (void...它明确表明了一个 block 被加入到了队列组group,此时group任务引用计数会加1(类似于OC内存管理), dispatch_group_enter(group)必须与dispatch_group_leave...(group)配对使用, 它们可以在使用dispatch_group_async时帮助你合理管理队列组任务引用计数增加与减少。...它明确表明了队列组里一个 block 已经执行完成,队列组任务引用计数会减1, 它必须与dispatch_group_enter(group)配对使用,dispatch_group_leave...我们再增加线程3耗时看看, //创建一个GCD线程3 dispatch_group_async(group, queue, ^{ //模拟异步耗时操作

3.1K41

Swift多线程:使用GCD实现异步下载图片1. GCD基础知识2. GCD基础应用3. GCD服务质量(优先级)

有很多老前辈们已经创造了非常非常多资料介绍GCD,因为大家都是把GCD放在了多线程内容分享最开始,所以导致好多好多理论知识都被放在了GCD部分。...只能在主线程中进行,并且主队列里面的任务,只有当主线程空闲时候才能被执行。用来刷新UI使用。 全局队列(global queue):是Concurrent Queue特殊一种。...工作,如果有多任务,首选global Queue + 异步。单任务、刷新UI就用main Queue + 异步。 2....GCD基础应用 我滴妈妈~经过上面的分析,最后,最基础使用就两种了。 多任务:global Queue + 异步。 单任务、刷新UI就用main Queue + 异步。...//use the global queue , run in asynchronous globalQueue.async { print("I am No.

1.5K60
领券