使用逻辑的顺序请求 - Swift 3、Xcode 8、Alamofire 4

Posted

技术标签:

【中文标题】使用逻辑的顺序请求 - Swift 3、Xcode 8、Alamofire 4【英文标题】:Sequential Requests With Logic - Swift 3, Xcode 8, Alamofire 4 【发布时间】:2016-11-02 15:56:25 【问题描述】:

更新:我使用 SwiftEventBus https://github.com/cesarferreira/SwiftEventBus,这似乎工作正常。我可以简单地定义等待每个步骤的事件侦听器。仍然对多步登录过程的其他方法感兴趣。

我需要解决多部分登录过程(卡在如何围绕串行 GET/POST 请求包装逻辑)

也在github上https://github.com/Alamofire/Alamofire/issues/1746

步骤 1 使用基本身份验证标头验证用户/密码 第 2 步在新的身份验证标头中使用返回的令牌(来自第 1 步)和 从服务器获取列表 第 3 步用户从返回的列表中选择(或向​​发出另一个请求 如果在列表中找不到东西,则创建新的) - 请注意非常重要的内容 该列表是因为我只对序列化和 跨步骤包装逻辑 第 4 步使用选定/创建的事物中的 guid 生成身份验证令牌以 获取另一个新的通用授权令牌和刷新令牌

我可以单独执行每一项(设置标头、设置参数、验证和解析结果等),但我不明白如何围绕请求创建逻辑流。我是否必须将所有请求相互嵌套,以便第 2 步发生在第 1 步中,第 3 步发生在第 2 步中,等等。或者是否有一个简单的示例应用程序显示如何使用请求周围的逻辑执行多个请求- 对简单地排队请求不感兴趣,因为我必须围绕请求运行逻辑。事件总线?托管队列?其他?寻找指导,最好是一个我可以玩和学习的可下载示例应用程序。

我最初在没有 Alamofire 的情况下构建了它,并且遇到了请求时间/逻辑问题,并认为 Alamofire 可能会使这更容易,但在切换到 Alamofire 后,我发现自己陷入了困境。在没有 Alamofire 的情况下接受建议,以了解如何执行此操作。

【问题讨论】:

【参考方案1】:

这不是内置在 Alamofire 本身中的,因为它是基于回调的,但您可以使用回调并将对 Alamofire 的每个调用嵌套到另一个调用中:

Alamofire.request("url").responseJSON  _ in
    Alamofire.request("anotherUrl").responseJSON  _ in 
        Alamofire.request("yetAnotherUrl").responseJSON  _ in 
            //all three have finished with either response or error
        
    

这导致了一种常见于回调的模式,有时也被称为末日金字塔。

作为替代方案,您可以查看Promises,或者我喜欢使用像RxSwift 这样的响应式库,它可以让您的代码看起来更像“瀑布”。

Alamofire 还有一个PromiseKit extension 和一个RxSwift extenstion。

【讨论】:

以上是关于使用逻辑的顺序请求 - Swift 3、Xcode 8、Alamofire 4的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 中的顺序网络请求

相同的上下文菜单以不同的顺序显示 Xcode 12. Swift 5

Swift 3 / Xcode 8 - CNContact [访问] <私人>

Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误

Swift 3 - 创建简单请求方法 POST (URLRequestConvertible) 的问题

iOS开发-登录界面开发Toast-Swift的使用-Swfit4.1_Xcode9.3.1