如何在 Alamofire 中处理多个网络调用

2023-11-24

我需要在视图控制器中调用2个api来从服务器获取一些数据,我希望它们同时启动,但只有当它们都返回时才会触发下一步(不管成功还是失败) )。 我可以想出两种解决方案: 1. 将它们链接在一起。调用api1,在api1的结果处理程序中调用api2,等待api2的结果 2. 设置2个Bool指示变量,创建一个检查函数,如果这两个指示符都为true,则执行下一步。在两个Apis结果处理程序中,设置相应的指示变量,然后调用检查函数来决定是否可以继续

第一个还不够,我不能说第二个是一个优雅的解决方案。 Alamofire 是否有类似 Reactivecocoa 中的组合信号之类的东西?或者有更好的解决方案吗?


您的评估是 100% 正确的。目前,您提出的两个选项实际上是唯一可能的方法。我同意你的观点,考虑到你的用例,你的第二个选择比第一个选择要好得多。

如果您希望将 ReactiveCocoa 与 Alamofire 结合起来,那么这当然是可能的,但据我所知尚未完成。您还可以调查 PromiseKit 是否能够提供一些帮助,但它还没有与 Alamofire 粘合在一起。无论如何,尝试将这些库与 Alamofire 响应序列化器结合起来都不是一项简单的任务。

换个角度,我真的不认为 ReactiveCocoa 或 PromiseKit 非常适合您的用例,因为您不是链接服务调用,而是并行运行它们。此外,您仍然需要运行所有解析逻辑并确定每个解析逻辑是成功还是失败,然后相应地更新您的应用程序。我的意思是,选项 2 将是迄今为止最好的选择,除非您想尽一切努力将 PromiseKit 或 ReactiveCocoa 与 Alamofire 的响应序列化器相结合。

以下是我的建议,可以让事情变得不那么复杂。

import Foundation
import Alamofire

class ParallelServiceCaller {
    var firstServiceCallComplete = false
    var secondServiceCallComplete = false

    func startServiceCalls() {
        let firstRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["first": "request"])
        firstRequest.responseString { request, response, dataString, error in
            self.firstServiceCallComplete = true
            self.handleServiceCallCompletion()
        }

        let secondRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["second": "request"])
        secondRequest.responseString { request, response, dataString, error in
            self.secondServiceCallComplete = true
            self.handleServiceCallCompletion()
        }
    }

    private func handleServiceCallCompletion() {
        if self.firstServiceCallComplete && self.secondServiceCallComplete {
            // Handle the fact that you're finished
        }
    }
}

该实现非常干净且易于遵循。虽然我理解您希望摆脱完成标志和回调函数的愿望,但其他选项(例如 ReactiveCocoa 和/或 PromiseKit)仍然会有额外的逻辑,并且最终可能会让事情变得更加复杂。

另一种可能的选择是使用调度组和信号量,但这确实增加了复杂性,但可以让您更接近 ReactiveCocoa 或 PromiseKit 风格的方法。

我希望这有助于阐明一些问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Alamofire 中处理多个网络调用 的相关文章

  • 将 UIToolBar 添加到所有键盘(swift)

    我正在尝试以尽可能少的重复次数将自定义 UIToolBar 添加到我的所有键盘中 我目前的做法要求我将代码添加到所有 viewDidLoads 中 并将每个文本字段的委托分配给我正在使用的 viewController 我尝试创建自己的 U
  • $0 和 $1 在 Swift 闭包中意味着什么?

    let sortedNumbers numbers sort 0 gt 1 print sortedNumbers 谁能解释一下什么 0 and 1在斯威夫特中意味着什么 另一个样本 array forEach actions append
  • NSPredicate IN 从数组元素查询

    对于一个古怪的标题表示歉意 我有一个 Int 数组 我想定义一个 NSPredicate 来过滤掉 connectionType 等于数组中包含的值的项目 所以基本上是这样的 fetchRequest predicate NSPredica
  • 通过 Button Swift 中的标签发送行和部分

    我里面有这个cellForRowAtIndexPath cell plusBut tag indexPath row cell plusBut addTarget self action plusHit forControlEvents U
  • 在模拟器/预览版上运行的 SwiftUI:切换不起作用,控制台日志:“无效模式‘kCFRunLoopCommonModes’”

    更新 这是一条红鲱鱼 所以我最初的问题是问如何禁用导航链接 并且仅在两个链接时才启用Toggle影响两个 State var isXYZToggleOn Bool属性都是true 这一直有效 我第一次尝试使用 disabled hasAgr
  • 如何使用 AppDelegate 在视图之间共享 iAd 横幅

    我希望在我的应用程序中实现 iAd 到目前为止 我已经成功地使用下面的方法让它们在每个视图中正确显示 关闭 应用程序委托 import UIKit import iAd UIApplicationMain class AppDelegate
  • Swift:二元运算符“==”不能应用于“协议”类型的操作数

    我有一个协议 protocol ProfileManagerDelegete func dataHaveUpdated type ReturnType 并创建一个协议数组 并添加 删除侦听器 var listeners ProfileMan
  • 如何在 Objective C 中使用 swift 文件

    我想在 Objective C 代码中使用我的 Swift 文件 我找到了不同的链接 说明了如何操作 我的项目名称是 测试项目 我将 import Test Project Swift h 导入到我的 m 文件中 以在 Objective
  • 如何检测在 MapView 中选择了哪个注释

    我在地图内做了一些注释 当我点击它们时 我会看到一些信息 并且有一个打开地图的按钮 并且使用我无法接受的正确信息应该可以绘制出我的路线 这是我的代码 我有 2 个双精度数组用于我的经纬度 我从查询中填充了它们 var lat Double
  • 如何在 Swift Playground 中使用 Carthage 导入的框架

    我有一个快速项目 其中通过迦太基添加了一些框架 是否可以在项目内部的游乐场中使用这些框架以及如何使用它 因为 import Argo 不起作用 这在某个时候停止工作了 叹 我现在做的是 创建 macOS gt 命令行工具 创建一个购物车文件
  • Swift - 如何复制包含引用类型的数组

    我正在尝试复制数组及其值 为什么两个数组都引用同一个变量 您可以在 Playground 中尝试此操作 var view UIView view tag 1 var a UIView var b UIView a append view b
  • 如何在 RxSwift 中取消订阅 Observable?

    我想在 RxSwift 中取消订阅 Observable 为了做到这一点 我曾经将 Disposable 设置为 nil 但在我看来 更新到 RxSwift 3 0 0 beta 2 后 这个技巧不起作用 我无法取消订阅 Observabl
  • Swift 2.0:协议扩展:具有相同函数签名的两个协议编译错误

    鉴于这两个协议及其扩展 protocol FirstDelegate func someFunc protocol SecondDelegate func someFunc extension FirstDelegate func some
  • 更改iOS11中的UISearchBar背景图片

    我想更改我的 UISearchBar 背景图像 当将它添加为我的 UITableView 中的标题视图时 它工作得很好 但是 当我想更改它以将 SearchBar 设置为 navigationItem 的 searchController
  • 如何在 Swift 3 iOS 10 中创建自定义相册

    这听起来可能是重复的 但经过搜索 我仍然没有得到 Swift 3 的预期答案 当我尝试使用添加资产时为资产创建占位符后addAssets 方法 Xcode 建议我将 assetPlacehoder 转换为 FastEnumeration 类
  • 添加 NSCoding 作为扩展

    我想扩展一个框架类 我不想直接编辑源代码 并使其符合NSCoding 基本上 这是我所处情况的简化 Can t be edited class Car NSObject var color String Can be edited exte
  • 如何在松开按钮后立即看到新的视频层?

    我有一个应用程序 用户可以按住按钮来拍摄视频 然而 当他们这样做时 带有视频播放的新图层不会立即出现 相反 有一个非常短的延迟 在用户松开按钮后 您可以看到相机仍然显示相机所看到的内容 延迟结束后 视频立即显示并开始播放 但是 我怎样才能使
  • 从 UTC 转换为本地时区给出错误结果

    背景我需要将格式为 HH mm 的时间字符串从 UTC 转换为本地时区 例如 如果 UTC 时间为 09 00 则当地时间 斯德哥尔摩 欧洲 应提前两个小时 Problem当我将 09 00 UTC 转换为斯德哥尔摩 欧洲时间时 我得到 1
  • 在 Swift 中对约束进行动画处理

    我有一个UITextField我想在点击时放大它的宽度 我设置了约束 并确保左侧约束的优先级低于我尝试在右侧设置动画的约束 这是我尝试使用的代码 move the input box UIView animateWithDuration 1
  • Swift 运行时库与 Swift 标准库

    In this 关于如何使用 CocoaPods 的教程 https www raywenderlich com 97014 use cocoapods with swift我无法理解以下段落 与 Objective C 不同 标准 Swi

随机推荐

  • 活动被销毁是因为方向改变还是因为应用程序正在关闭?

    我有一个Activity启动一个异步任务 允许以纵向或横向方向显示活动 当方向改变时 Activity 将被销毁并重新创建 无论方向改变多少次 任务都会继续工作 它还成功地将结果返回给活动 根据 CommonsWare 的回答 http g
  • 如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

    我正在尝试选择一个选项进行网络测试 可以在这里找到一个例子 http www tizag com phpT examples formex php 除了选择一个选项部分之外 一切都很好 如何按值或按标签选择选项 My Code using
  • 如何将 selenium chrome 选项添加到“desiredCapability”?

    对于 selenium 我有很多 chrome 选项 我需要通过以下方式将其传递给远程网络驱动程序DesiredCapabilities 在本页有一个关于如何执行此操作的 java 示例 但是如何在 python 中执行此操作 这文档很穷
  • 使用 CNN 处理一维数据

    只是想知道是否有人这样做过 我有一个一维的数据集 但不确定它是否是正确的单词选择 与通常的 CNN 输入图像 二维 不同 我的数据只有一维 一个例子是 instance1 feature1 feature2 featureN instanc
  • Python ctypes 未在 Mac OS X 上加载动态库

    我有一个 C 库repeater so我可以通过以下方式从 Linux 中的 Python 加载 import numpy as np repeater np ctypeslib load library librepeater so 但是
  • 使用 GCC 的链接器错误,包括。用于 binutils 和 textinfo

    我每次在编译程序 配置和安装一些东西时都会收到此错误 例如binutils 文本信息等 usr local bin ld this linker was not configured to use sysroots collect2 err
  • 使用 Apple Pay 创建令牌,无需付款

    我有两个问题 有没有办法使用 Apple Pay 创建 STPToken 而无需付款 在我的 iOS 应用程序中 客户在注册时要么输入付款信息 要么决定使用 Apple Pay 当客户决定购买时 注册后的某个时间 他们的卡将自动扣款 我可以
  • Kdevelop 步骤和断点不起作用

    我需要使用步骤 单步执行 单步执行指令 和断点 但选项 跳过 跳过指令 等 在菜单 运行 中被禁用 当我在程序中放置断点时 程序不会在此断点处停止 我发现我必须关闭编译器和链接器的优化 但我不知道如何关闭 Kdevelop 4 4 1 中的
  • ASP.NET:视图状态和以编程方式添加用户控件

    当使用 LoadControl string path 以编程方式添加用户控件时 在用户控件的页面生命周期中 它何时使用其视图状态初始化其子控件 我问这个问题是因为我正在以编程方式加载的用户控件之一有一个 TextBox 控件 该控件未通过
  • 使用批处理文件命名驱动器

    我正在寻找一个命令来重命名我在 WinXP 中每次启动时映射的几个驱动器 我已经完成了映射部分 现在我有兴趣使用自定义名称以编程方式命名它们 这样我就可以保持它们的一致性 我放弃了 DOS 转而学习 PowerShell 最终的结果是这样的
  • Node.js“require”语句中的大括号(大括号)

    我试图理解下面两个 require 语句之间的区别 具体来说 其目的是什么 s 缠绕着ipcMain const electron require electron const ipcMain require electron 他们似乎都分
  • 如何在 Android 中缩放文本视图?

    谁能指导我在android中的多个视图上执行放大和缩小操作 我需要在图像 文本视图的触摸上执行放大和缩小操作 我的父级布局应该是什么 这是在触摸图像视图时缩放图像的代码 如何缩放文本视图 请帮我 These matrices will be
  • 所有 OLE 错误代码的列表

    是否有所有 OLE 错误代码的列表 None
  • 如何跟踪 WCF 序列化问题/异常

    我偶尔会遇到这样的问题 在 WCF 序列化期间 从我的 OperationContract 返回 DataContract 后 抛出应用程序异常 我收到的唯一 且意义不大 的消息是 System ServiceModel Communica
  • 发送至特定远程 IP 的第一个 UDP 消息丢失

    我正在开发一个基于 LAN 的解决方案 其中一个 服务器 必须控制多个 玩家 我选择的协议是 UDP 因为它很简单 我不需要连接 我的流量仅由时不时的短命令组成 我想使用混合广播消息进行同步 并使用单个目标消息进行玩家单独的命令 多播 TC
  • HTML 输入不允许数字

    现在我有一个像这样的输入字段
  • 在 SVN 中合并后我无法提交更改

    使用 TortoiseSVN 合并项目的两个分支后 我在提交更改时遇到了问题 详细信息如下 我做了一个合并分支到主干project我正在努力 Project包括主存储库和与主存储库联合的库 如下所示svn 外部 图书馆也有分支 作为子目录p
  • 如何将本地变量传递给远程“Invoke-Command”? [复制]

    这个问题在这里已经有答案了 我正在尝试使用以下命令检索位于远程服务器上的文件的哈希值Invoke Command 当我给出如下完整路径时 它工作得很好 Invoke Command ComputerName winserver Script
  • x86 上的堆栈对齐

    在 x86 32 位 平台上 当运行使用 gcc 4 8 1 编译的代码时 出现了一个神秘的总线错误 march pentium4 我将问题追溯到 SSE 指令 movdqa xmm5 0x50 esp esp 0xbfffedac mov
  • 如何在 Alamofire 中处理多个网络调用

    我需要在视图控制器中调用2个api来从服务器获取一些数据 我希望它们同时启动 但只有当它们都返回时才会触发下一步 不管成功还是失败 我可以想出两种解决方案 1 将它们链接在一起 调用api1 在api1的结果处理程序中调用api2 等待ap