Tag: 异步

使用PromiseKit和Alamofire在Swift中下载图像

问题 如果我们必须从远程位置下载一些内容,则网络代码可能会变得非常混乱。 首先,我们必须知道要从中下载内容的路径(URL) (在我们的示例中为图片) 。 其次,可能该位置或路径将写入一些REST API端点请求中,并且在处理了JSON数据响应之后,我们必须开始下载图像,最后必须更新UI。 所有这些都必须在后台线程上完成,因为我们不想阻塞主线程,当然我们希望我们的应用程序保持响应。 此类问题的最佳解决方案是使用异步编程,并且如果我们希望我们的代码看起来非常整洁,则PromiseKit是最佳选择。 如果您不熟悉异步编程,请查看我以前的有关如何使用PromiseKit for Swift的文章。 接下来,我们将使用CocoaPods依赖项管理器安装PromiseKit和Alamofire库以用于网络请求。 要与其他依赖项管理器一起安装库,请访问PromiseKit的官方文档https://github.com/mxcl/PromiseKit和Alamofire https://github.com/Alamofire/Alamofire。 使用CocoaPods安装PromiseKit和Alamofire 如果您尚未安装CocoaPods,那么现在该进行安装了。 转到终端应用程序并输入: $ sudo gem install cocoapods 有关使用CocoaPods依赖性管理器的详细信息,请访问官方网站https://cocoapods.org/。 创建一个新的Xcode项目(Single View Application),并在项目目录中使用命令pod init创建新的podfile。 打开podfile并添加PromiseKit和Alamofire依赖库: 目标’YourProjectTarget’做 使用动态框架 use_frameworks! pod’PromiseKit’ 豆荚“ Alamofire” 结束 保存podfile,此时您可以在终端中使用pod install命令安装库: $ pod安装 从现在开始,您必须打开新创建的工作区文件.xcworkspace而不是.xcodeproj。 就是这样,现在我们可以在项目中使用PromiseKit和Alamofire了。 现实世界的例子 在本教程中,我们将从远程位置下载照片集。 我们假设照片的URL将在某些REST API端点中编写,并且出于本示例的目的,我们将使用占位符API https://jsonplaceholder.typicode.com/photos,该URL具有用于5000张照片的URL。 下载照片可能需要一些时间,因此我们将显示带有activityIndicator组件的预加载动画,并在下载完成后将其隐藏。 我们不会保留照片,它们将存储在临时数组[UIImage] 。 为了显示照片,我使用的是UICollectionView但是您可以自由使用任何可视组件进行显示。 采取的步骤: 显示预加载动画 获取并序列化json响应 下载照片 […]

无极内部

我如何在Swift中构建Promise / A +库 Hydra的GitHub页面 上也提供了这篇文章 介绍 在Objective-C中进行异步编程从来都不是真正令人兴奋的经历。 我们已经使用了多年的代表(我仍然记得我第一次见到它,那是在2001年左右,当时我在Mac OS X上玩过Cocoa的乐趣) ,不久前我们也参加了完成会议处理程序。 但是,这两个过程都不能很好地扩展,并且不能提供可靠的错误处理机制 ,特别是由于语言本身的某些限制( 是的,您几乎可以在C语言中执行任何操作,但这不在本文的讨论范围之内 )。 在厄运的回调金字塔(也称为回调地狱)中迷失自己是很容易的,并且通常您的代码最终变得不那么优雅,阅读和维护起来也不那么简单。 Promises可以帮助我们编写更好的代码,并且在诸如await/async之类的结构的帮助下,处理异步编程确实是一种乐趣。 早在2016年11月,我就决定在Promise库中工作,只是为了进一步了解如何实现此概念以及如何使用Swift这样的现代语言来实现这一概念。 在本文中,我将更深入地了解Promise库:Hydra的体系结构。 在本文中,您不会了解如何在下一个杀手级应用程序中使用Hydra,但将了解它在幕后的工作方式(但是我为Hydra编写了完整的文档,可在GitHub上找到它)。 什么是诺言? 承诺是将来可能会产生单一价值的对象。 该值可以是您期望的对象(即JSON响应)或失败原因(即网络错误) 。 许诺可能处于以下状态之一:已resolved (或已fulfilled ),已rejected或pending 。 一个承诺开始于待处理状态,可以转换到两个状态中的另一个状态。 一旦解决,就无法重新安置。 Promise的用户可以附加回调(或观察者)以获取有关任何状态更改的通知。 then ,Promise的最常见的运算符是and catch ,用于获取Promise的值或捕获任何发生的错误。 但是,还有其他几个运算符可以大大简化网络代码的编写方式,但我们稍后会介绍。 一点历史 Promise的历史可以追溯到很久以前,即1980年代初。 最早的实现最早是在1980年代以Prolog和Lisp等语言出现的。 “ Promise ”一词由Barbara Liskov和Liuba Shrira在一篇名为“ Promises:分布式系统中对高效异步过程调用的语言支持”的学术论文中提出(1988)。 随着承诺兴趣的增长,ECMAScript标准重新定义了Promise的新规范:Promise / A +用于定义Promise的边界和行为。 符合Promise / A +实施的主要规则是: Promise或“ […]

在Swift中链接异步函数

在本文中,我们将看到如何在Swift中使用函数组合来链接多个异步请求(不必用于RxSwift)。 编辑:Brandon Kase指出,这种组合实际上称为Kleisli组合,并且要使用的正确运算符是fish / Kleisli运算符: >=> (而不是|> )。 这很棒! 一件事:我建议使用> =>运算符代替|>,因为|>(称为管道转发)传统上用于向后函数应用程序。 您在这里拥有的是kleisli合成(并且> =>是kleisli合成运算符)。 -Brandon Kase(@bkase_) 2018年2月1日 [您可以下载本文的配套 Playground 。] 假设我们有一个具有以下模型的付款验证应用程序: 对Web服务的一般请求可能如下所示: 正如您应该猜到的那样,我们将使用函数组合来实现这一点。 让我们采用通用请求函数: func fetch(_输入:InputType,完成:(Result )->无效) 并用以下别名表示它: 公共类型别名Request =(T,@转义RequestCompletion )->无效 在我们的例子中,U将映射到 Result 。 接下来,我们将定义一个运算符,该运算符将允许我们通过管道传递请求。 分解> =>运算符 该运算符是T , U和V三种类型的泛型运算符,并使用2个函数f和g作为参数,其中: f取一个T并以Result g取一个U并以Result 。 它返回一个带有签名的组合函数: Request<T, Result>即接受f输入并以Result完成的函数。 注意: 输入为 T 类型 CombineCompletion的类型为RequestCompletion RequestCompletion<Result> 。 这个返回函数的实现从应用f开始,然后在f的完成块中,它切换一个Result 。 如果f以.success […]