Tag: Gcd

GCD提示和技巧

Swift中的线程安全集合 在Swift中使用Array和Dictionary时,有时(可能很多次)可以看出它们不是线程安全的(在Swift中,更新对象的实例变量不是原子的)。 多个线程可以同时修改一个集合,并且当它们在同一位置写入时,可能导致该内存块损坏。 我们想要的是只有一个线程更新和多个读取(同时)。 这是读写问题的经典实例。 GCD提供.barrier标志,该标志仅在队列中没有其他操作时才执行块。 因此,这一次将写入次数限制为一次。 let queue = DispatchQueue(标签:“ some.unique.identifier”,属性:.concurrent) 创建并发队列后,我们的同步读取将同时发生。 使用.barrier异步分派写入操作将确保队列中每个当前正在执行的块在运行写入块之前都将完成。 … 私人函式写入(_补全:@转义(()->无效)){ queue.async(flags:.barrier){complete()} } func insert(_ object:T){ 写{ self.container.append(对象) } } 对于完整的实现,请签出:https://gist.github.com/eigams/3bddcdd0427d5a40e85259d5f403e1d2 汇总多个并发任务的结果 在日常工作中,有时需要在for循环(具有不同的参数)中运行异步函数,然后在完成时必须通知我们,以汇总其结果。 类似于: var容器:[String] = [] 用于数组{ asyncFunction(…){导致 container.add(结果) } } //用容器做点什么 GCD提供dispatch_group来提供帮助。 组通过.enter / .leave调用跟踪与之关联的项目。 当.leave调用匹配.enter时,它将调用传递给.notify的完成块 这样,我们可以展平具有完成块的函数。 当所有工作完成后,.notify下的块将被调用,然后我们就可以利用汇总结果 希望您喜欢阅读!

在Swift中同步多个异步任务

您可能会遇到这样的情况:首先需要完成一些异步任务,然后才能跳到快速程序的下一个阶段。 在本文中,我们研究了可以应用于异步运行任务并在流程结束时获得通知或获取结果的不同解决方案。 通常,您可能需要先存储多个网络请求的结果,然后再向用户显示正确的数据。 的确,如果您必须请求许多网络资源来执行应用程序的功能,它可能会消耗更多的设备能量,您可能会三思而后行,但这与本文无关。 假设我们有一个示例网络请求函数,如下所示: 我们希望通过网络满足一些网络要求: 在上面的示例中, baseUrl指示我们的基本端点URL,并且这些endpoints是来自Web服务器的不同请求。 多个独立任务(并发队列) 我们可以有彼此独立的不同异步任务。 这意味着我们可以以任何顺序运行它们,并且一个结果与另一任务无关。 派遣组 Grand Central Dispatch或GCD自动管理线程的创建,并根据iOS中可用的设备资源来平衡线程的创建。 我们可以使用DispatchGroup创建一堆异步任务,并在所有任务完成后继续我们的工作: 当任务完成时,我们已通知主线程,但也可以是其他任何线程。 以下输出可能是结果(或子任务完成的任何任意顺序): 任务相册已完成 任务发布完成 待办事项 任务注释已完成 任务用户完成 任务照片完成 所有任务都完成了 如您所见,在处理完所有任务后,我们收到了“所有任务已完成”消息。 承诺 强烈建议您使用一种模式来解决此问题:承诺。 一般来说,promise表示异步任务的最终结果 ,或者表示任务失败时的错误原因 。 类似的概念也称为期货 (有关更多信息,期货和承诺,请参阅此Wiki文章)。 我们可以假设一个承诺的3个不同状态: 待处理 :尚未解决的任务,结果尚不可用 已完成 :具有一定价值的已解决任务(成功响应) 拒绝 :已解决任务,但有错误 有很多Cocoapods库可以提供承诺。 Google Promises是Swift中最好的实现之一: 谷歌/承诺 Promises是一个现代框架,为Swift和Objective-C提供了同步结构。 – google / promises github.com 现在我们可以使用Promises更新解决方案: 可以看出,promise简化了异步任务过程。 在performNetworkPromise我们首先创建了一个待处理流程,该流程将返回一些数据。 就像我们已初始化的一个空的异步请求容器一样。 承诺中的数据类型决定了将要满足的数据类型。 […]

运营和中央调度的面试问题(第二部分)

iOS面试问题,gcd面试问题,多线程ios面试问题,iOS 在本文中,我将介绍一些与Dispatch相关的问题,但是解决方案以目标C语言给出,并且可以在Swift上移植。 为这些问题在目标C中提供解决方案的原因是我在Citrix等公司接受采访的一位朋友,他们之所以要求在目标C中编写解决方案,是因为开放是面向同时了解obj C和Swift的开发人员的。 希望它也能帮助其他开发人员,让我们开始吧。 Q1。 dispatch_once和dispatch_once_t的用途是什么,用示例写下代码? 解决方案 : 单身人士 Q2。 dispatch_after的用途是什么,用示例写下代码? 解决方案 :如果您需要在特定的时间点运行某些内容,那么dispatch_after可能是正确的选择。 一定也要检查NSTimer。 Q3。 什么是目标队列,用示例写下代码? 解决方案 : 惊喜:您已经在使用它们! 您创建的任何队列都必须具有目标队列。 默认情况下,它设置为DISPATCH_QUEUE_PRIORITY_DEFAULT全局并发队列。 Q4。 下面的代码有什么问题,如何解决? 解决方案 : dispatch_set_target_queue使从firstQueue或secondQueue执行的每个块都表现得“好像”已使用dispatch_async提交给并发队列。 成为目标队列不会影响dispatch_barrier_ *函数的语义。 屏障保证在屏障块运行时队列中没有其他任何执行。 Q5。 编写用于创建所有类型的队列的代码,还让我们知道优先级吗? 解决方案 : Q6。 编写一个资源,多个读取器和一个写入器的代码(基本上是用于多线程读取和单线程写入的读取器写入器)? 解决方案 :同步/异步模式的一种优化是读写器模式,在该模式下,允许并发读取,但不允许并发写入。 因此,您将使用并发队列,dispatch_barrier_async进行写操作(实现写操作的类似串行行为),但是使用dispatch_sync进行读操作(就其他读取操作而言,享受并发性能)。 Q7。 编写死锁条件代码? 解: Q8。 什么是dispatch_apply ? 为用例编写代码? 解决方案: dispatch_apply —迭代执行性能的改进,请查看下面的示例以更加清楚。 Q9。 编写DispatchGroup用例的代码? 解: Q10。 编写DispatchGroup用例的代码? 解: […]

iOS中的线程[第1部分] GCD —快速方法

线程是iOS中重要的核心概念。 作为程序员,了解线程如何工作以及如何利用它非常重要。 启动应用程序时,它将在主线程或UI线程上运行。 如果尝试在主线程中执行耗时的任务,它将阻塞UI,这意味着UI会停止响应一段时间,从而给用户带来糟糕的体验。 为了避免这种情况,我们可以使用多线程在其他线程中执行耗时的任务,从而不会阻塞UI。 假设您在viewDidLoad()中有一个函数需要花费5秒钟以上的时间来完成和更新您的集合视图。 在此,UI将被阻止至少5秒钟,并且不会显示集合视图。 这是一个坏习惯。 耗时的任务应在其他线程(后台线程)中执行。 快速地,我们使用GCD-中央分配器来访问线程。 快速地,有不同类型的线程: DispatchQoS-服务质量,它确定线程中任务的优先级。 让我们看看如何在线程中运行任务。 重要的是您需要始终在主线程中更新UI。 否则,可能会导致崩溃 这是快速线程的基本工作。 一旦了解线程如何工作,就可以深入研究它。 如果您喜欢阅读这篇文章,请分享并鼓掌。

大中央调度#1

自推出以来,Grand Central Dispatch已成为Apple平台上并发编程的最终解决方案。 GCD同时执行代码,提供调度和同步功能,并与语言功能和API无缝集成。 GCD提供并管理应用可以向其提交任务的队列。 这种抽象隐藏了线程管理,并专注于构建任务序列。 GCD是Objective-C的一项现代功能,它提供了一组丰富的方法和API,可用于支持常见的多线程任务。 它提供了一种将任务排队以进行调度的方法: 主线程“只有一个线程是主线程,所有其他线程都是背景” 并发队列(并行运行) 或串行队列(以FIFO顺序运行) 我们可以创建自己的线程,但这可能会导致很多问题。 在将任务分配给GCD或工序队列时 ,系统将自行管理线程。 我们可以创建多个任务并将其分配给队列。 每个任务分为多个单元,每个单元由可用线程执行。 系统将任务分解为多个单元并将其分配给线程。 并发问题 (使用GCD或操作队列可以避免前两个问题 ): 竞争条件 :两个线程试图同时访问一个资源(变量或内存中的数据结构) 。 Xcode中的Thread Sanitizer可以为我们进行管理。 假设您在后台线程中访问变量时更改了主线程中的变量! 2.当高优先级工作依赖于低优先级工作时, 优先级反转将一直停止,直到低优先级完成所需的工作,然后恢复。 3.死锁 Xcode中的调试导航 器可区分线程, 时间分析器记录不同线程上的活动,而线程清理程序可帮助捕获线程违规。 信用