Swift 从对象数组映射到异步函数数组并等待它们全部

2024-03-04

我刚刚更新到 Xcode 13.2.1,现在可以访问异步等待,并且我正在尝试找到可以从合并“转换”为异步等待的地方。

我想实现以下目标...

给定一个像...的类型

struct Person {
  let name: String

  func fetchAvatar(completion: @escaping (UIImage?) -> Void) {
    // fetch the image from the web and pass it into the completion.
  }
}

我目前有这样的功能......

func fetchAllTheAvatars(people: [Person], completion: ([UIImage]) -> Void) {
  Publisher.MergeMany(
    people.map { person in
      Future<UIImage?, Never> { promise in
        person.fetchAvatar { promise(.success($0)) }
      }
    }
  )
  .compactMap { $0 }
  .collect()
  .sink { completion($0) }
  .store(in: &cancellables )
}

现在......在我看来,这可能是转向使用 async wait 和的一个很好的候选者AsyncSequence或许...?!?但它不一定是理想的,我只是想了解如何使用它们。我已经习惯了async await在 JS 和 TS 中,这似乎有点不同。 :D

我向我的 Person 添加了一个包装函数...

func fetchAvatar() async -> UIImage? {
  await withCheckedContinuation { continuation in
    fetchAvatar { image in
      continuation.resume(returning: image)
    }
  }
}

但现在我陷入了如何更新我的fetchAllTheAvatars功能。

func fetchAllTheAvatars(people: [Person]) async -> [UIImage] {
  people.map { ...???... }
}

我在网上看到的所有地方似乎都在使用for await line in url.lines { ... }但我还没有 AsyncSequence。我需要以某种方式“转换”我的非异步数组Person进入一个AsyncSequence of () -> Image?.

那可能吗?我的处理方式完全错误吗?

Thanks


标准模式是TaskGroup。为各个图像添加您的任务,然后await in a for loop, map,或者,在这种情况下,reduce:

func fetchAllTheAvatars(people: [Person]) async -> [Person.ID: UIImage] {
    await withTaskGroup(of: (Person.ID, UIImage?).self) { group in
        for person in people {
            group.addTask { await (person.id, person.fetchAvatar()) }
        }
        
        return await group.reduce(into: [:]) { dictionary, result in 
            if let image = result.1 {
                dictionary[result.0] = image
            }
        }
    }
}

请注意,因为订单无法保证并且因为您的一些Person可能不会返回图像,我的实现返回一个高效的、与顺序无关的结构(即字典)。

不用说,上面假设你做了Person符合Identifiable:

struct Person: Identifiable {
    let id = UUID()
    let name: String
    
    func fetchAvatar() async -> UIImage? { … }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 从对象数组映射到异步函数数组并等待它们全部 的相关文章

  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • 在 Firebase 中构建聊天应用的数据

    我正在关注 Firebase 指南结构化数据 https firebase google com docs database ios structure data flatten data structures对于聊天应用程序 他们建议的结
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 保存来自 TrueDepth 相机的深度图像

    我正在尝试保存 iPhone X TrueDepth 相机的深度图像 使用AVCam照片滤镜 https developer apple com library content samplecode AVCamPhotoFilter Lis
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 如何使用 Swift 将“完成”按钮添加到 iOS 中的数字键盘?

    它在默认键盘上工作得很好 但我无法让它在数字键盘上工作 有任何想法吗 据我所知 你不能在键盘部分添加 完成 按钮 你应该添加一个inputAccessoryView to the UITextField or UITextView 如果这就
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • xcode 9.0.1 / swift 4,没有使用 Objective-C 选择器 'onClick:forEvent:' 声明的方法 [重复]

    这个问题在这里已经有答案了 I use swift 4为了构建我的 UI 我创建了一个UIButton并想为其添加一个目标 但编译器会抛出警告 No method declared with Objective C selector onC
  • 在 UITableView 的部分标题文本下方添加一些边距

    我已经设计了标题文本的样式 func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath gt UITableViewCell let ce
  • 如何在 Swift 中使用未知密钥解码 JSON 响应?

    我想将数据拆分为https blockchain info ticker https blockchain info ticker这样每一行都是它自己的String在一个数组中 我正在制作一个获取所选货币价格的应用程序 因此 如果有人想要澳
  • 使用 IAsyncEnumerable 对另一个服务或 API 进行异步调用并批量返回响应

    我正在尝试创建一个 API 一旦准备好就返回结果 目标是 准备就绪后立即生成结果的 API 端点 消费应用程序调用端点并在数据准备好后立即处理数据 我的 API 调用另一个服务 HttpGet Route stream public asy
  • 从 WEB API 控制器的异步方法中返回 Void

    我从这个博客获得的 ASP NET MVC 4 WEB API 控制器中有这个异步方法 http www strathweb com 2012 04 html5 drag and drop asynchronous multi file u
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • 调用 SwiftUI 中位置 #11、#12 处的额外参数 [重复]

    这个问题在这里已经有答案了 我在 SwiftUI 中的切换开关上不断收到 调用中位置 11 12 处有额外参数 错误 我见过其他人有 调用中的额外参数 错误 但答案似乎没有帮助 另外 我的错误是 位置 11 12 我还没有看到其他人发生这种
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图

随机推荐

  • React Native:如何检测带有 Notch 的 iPhone?

    我正在尝试举一个具体的案例iPhone Xs Max in react native 这就是我的代码IphoneX from 反应本机 iphone x helper https www npmjs com package react na
  • 读取单选按钮值 - Angular 2

    我正在尝试读取单选按钮值 以角度 2 表示 索引 html
  • 忽略连接字符串中的连接超时属性

    我正在用 C 构建一个应用程序 我使用的连接字符串如下 DSN SomeDataSource Trusted Connection yes Uid SomeId pwd somePwd Connection Timeout x 但无论我设置
  • Python - 使用选择器的非阻塞套接字

    我的问题简而言之 我不知道选择器如何知道哪个套接字应该首先读取或写入 它是一个可以处理多连接的服务器 其流程应该是 服务器创建监听套接字 客户端创建2个套接字并将它们连接到服务器 客户端2套接字发送消息 服务器 2 套接字回显这些消息 客户
  • 将 .NET Framework 3.5 迁移到 4.5 时出错

    我们正在将 Web 应用程序从 NET Framework 3 5 迁移到 4 5 在我们的开发机器上 我们使用 VS2012 并运行 Windows 7 操作系统 在这个过程中我们得到了如下错误 基类包含字段 htmlTag 但其类型 S
  • 让 jquery ajaxStop 每次只触发一次

    由于某种原因 我的 ajaxStop 代码现在触发了两次 我需要将其限制为一次 submit bind click function e fileupload ajaxForm target status submit document a
  • 是否可以使用 ggplot 在地图上覆盖散点图?

    我想画一张法国省份 即法国的地区 的地图以及地图上的标绘点 我使用 ggplot2 绘制地图 但是当我想在地图上添加点时 R 返回一个错误 指出它找不到 组 library ggplot2 library ggmap load the co
  • 实体框架未将更改保存到数据库中

    我很困惑为什么这段代码不起作用 它应该在循环后保存对数据库的更改 但是当我放置SaveChanges循环内的方法 它将记录保存到数据库中 但在循环外不保存任何内容 大概只有300 1000条记录 static bool lisReady f
  • Fragment中的Toast,应该使用getActivity()还是getAcitivity().getApplicationContext()?

    抱歉我的新手问题 我只是无法从谷歌和stackoverflow找到答案 我刚刚开始学习android 希望能为android知识打下良好的基础 我想知道如果我在片段中创建 toast maketext 我应该在下面使用哪个 getActiv
  • 从无状态 EJB 访问 SessionScoped 对象

    我确实有一个 SessionScoped 课程 对于每个用户访问 我需要一个此类的自己的实例 很长一段时间一切都很顺利 但现在我还需要从后端访问这些对象 而无需任何用户交互 我确实有一个无状态企业 bean 但每当我想访问会话范围对象时 我
  • 使用 EF Core 7 的 .NET 7 控制台应用程序为什么没有 OnConfiguring?

    我首先构建了数据库 NET 7 和 EF Core 7 应用程序 并使用 EF Power Tools 创建上下文和模型类 我继续阅读有关OnConfiguring 在上下文类中 我只有OnModelCreating 我做错了什么 谢谢 道
  • Clojure:转换 Varargs 但保留 Varargs

    我正在用 Clojure 开发一个小宠物项目 我有一个传递可变参数的函数 defn foor bar args let new args custom transform args do something new args But do
  • 从 UITapGestureRecognizer 中删除目标

    我已将操作作为匿名方法添加到我的手势识别器中 UITapGestureRecognizer tapGesture new UITapGestureRecognizer tapGesture AddTarget gt HandleTap ta
  • .Net Core 3.0 Nginx 不提供静态文件

    我有一个 net core 3 0 Web 应用程序 我想在 Debian Buster 服务上运行 我按照微软的说明进行操作发现Here https learn microsoft com en us aspnet core host a
  • 特定递归函数的增长顺序

    以下函数的增长顺序是什么 static int counter 0 static void Example int n if n 1 return for int i 0 i lt n i counter Example n 2 为了解决这
  • 如何在给定的绘图上绘制垂直线

    给定时间表示中的信号图 如何绘制标记相应时间索引的线 具体来说 给定一个时间索引范围从 0 到 2 6 秒 的信号图 我想绘制垂直红线来指示列表的相应时间索引 0 22058956 0 33088437 2 20589566 我该怎么做 添
  • 如何检查Google用户的图片是默认的还是上传的?

    如何检查用户的个人资料图片是默认的还是上传到 Google 的 Note 当您从 API 获取用户详细信息时 所有默认个人资料图片都有以下 URL https lh3 googleusercontent com XdUIqdMkCWA AA
  • 适用于 Safari 浏览器的类似 Firebug 的插件

    Safari 是否有一个开发工具插件 就像 Firefox 的 Firebug 插件一样 Firebug 很棒 但 Safari 提供了自己的内置开发工具 如果您还没有尝试过 Safari 的开发工具包 请转到 Safari gt 首选项
  • Vim 的 Clang 完整版

    我复制了clang complete vim插件 但是当我输入 在一些变量之后 它说 未找到模式 我搜索了这个问题 有人说我应该配置g clang complete auto and g clang complete copen 我怎样才能
  • Swift 从对象数组映射到异步函数数组并等待它们全部

    我刚刚更新到 Xcode 13 2 1 现在可以访问异步等待 并且我正在尝试找到可以从合并 转换 为异步等待的地方 我想实现以下目标 给定一个像 的类型 struct Person let name String func fetchAva