在 Swift 中传递和存储闭包/回调

2024-01-02

我想用快速代码执行以下操作:

我必须调用我的 api 才能更新几个项目。所以我异步调用每个项目的 api。每个 api 调用完成后都会执行一个回调函数。这些回调会减少计数器的值,这样当计数器达到 0 时我就知道所有 api 调用都已完成。当计数器达到 0 时,我想调用最终回调函数(所有调用完成后一次),以便更新我的 UI 等。最后的回调在开始时传递给我的服务并存储在类属性中以供稍后执行。

可执行的游乐场源:

// Playground - noun: a place where people can play

class MyService
{
    let api = MyApi()

    var storedFinalCallback: () -> Void = { arg in }
    var queue: Int                      = 0

    func update(items: [String], finalCallback: () -> Void )
    {
        // Count the necessary API calls
        queue               = items.count
        // Store callback for later execution
        storedFinalCallback = finalCallback

        for item in items {
            // Call api per item and pass queueCounter as async callback
            api.updateCall(item, callback: self.callback())
        }
    }

    func callback()
    {
        queue--
        // Execute final callback when queue is empty
        if queue == 0 {
            println("Executing final callback")
            storedFinalCallback()
        }
    }

}

class MyApi
{
    func updateCall(item: String, callback: ())
    {
        println("Updating \(item)")
    }
}

let myItems: [String]     = ["Item1", "Item2", "Item3"]
let myInstance: MyService = MyService()

myInstance.update(myItems, finalCallback: {() -> Void in
    println("Done")
})

The problem is that with this code the final callback is called in the wrong order. As the console output from the playground shows.

显然回调函数已经执行但没有正确传递。然而,这是我能够做到这一点并且没有编译器错误的唯一方法。

任何帮助将非常感激 - 我已经被困在这个问题上两天了。


我终于找到了工作代码:

// Playground - noun: a place where people can play

class MyService
{
    let api = MyApi()

    var storedFinalCallback: () -> Void = { arg in }
    var queue: Int                      = 0

    func update(items: [String], finalCallback: () -> Void )
    {
        // Count the necessary API calls
        queue               = items.count
        // Store callback for later execution
        storedFinalCallback = finalCallback

        for item in items {
            // Call api per item and pass queueCounter as async callback
            api.updateCall(item, callback: self.callback)
        }
    }

    func callback()
    {
        queue--
        // Execute final callback when queue is empty
        if queue == 0 {
            println("Executing final callback")
            storedFinalCallback()
        }
    }

}

class MyApi
{
    func updateCall(item: String, callback: () -> Void)
    {
        println("Updating \(item)")
        callback()
    }
}

let myItems: [String]     = ["Item1", "Item2", "Item3"]
let myInstance: MyService = MyService()

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

在 Swift 中传递和存储闭包/回调 的相关文章

随机推荐

  • 无法使用 Actions SDK 读取意图

    我的 action json 文件中有以下操作 description Recommend movies initialTrigger intent GIVE RECOMMENDATION queryPatterns queryPatter
  • Django 1.4 - 重定向到非 HTTP url

    我们有一个重定向到非 HTTP url 方案的视图 它在 iOS 应用程序中使用 但由于我们已经升级到 Django1 4 因此执行此重定向代码时会发生崩溃 它崩溃了 myyrlscheme 的可疑操作 使用方案 appdev 不安全地重定
  • 在Linux环境下运行.bat

    有没有办法在Linux环境下运行 bat文件 我有几个 bat 文件 它们的目的是调用 mvn install install file 脚本 因此 脚本中不依赖任何操作系统 谢谢你 您可以使用wine http www winehq or
  • Perl foreach 循环变量范围

    我是 Perl 新手 在编写以下代码片段后对 Perl 作用域规则感到困惑 usr bin perl my i 0 foreach i 5 10 print i n print Outside loop i i n 我预计输出如下 5 6
  • 为组织添加用户时常见连接配置文件丢失错误

    我正进入 状态 Error Common connection profile is missing this client s organization and certificate authority 运行时出错gateway get
  • 如何通过gdb调试nodejs插件

    Heading 我正在编写一个 Node Js C 插件 当我尝试通过在互联网上搜索的方式调试我的 C 添加时 它根本无法工作 我从互联网得到的是 gdb节点 设置参数app js 跑步 我明白了 usr local bin node 不是
  • 如何确定“BUS-Error”的原因

    我正在开发一个带有 yocto 发行版和 python 2 7 3 的 variscite 板 我有时会得到总线错误来自 python 解释器的消息 我的程序在错误发生之前至少几个小时或几天正常运行 但是当我得到它一次时 当我尝试重新启动程
  • 使用 JavaScript 编辑 CSS 渐变

    我正在 Firefox 中通过 JavaScript 编辑 CSS 渐变 我有用户可以输入的输入框 1 方向 2 第一种颜色 3 第二种颜色 这是html
  • 滑动最后一个视图控制器后,如何关闭/弹出 UIPageViewController?

    滑动最后一个视图控制器后 如何关闭 弹出 UIPageViewController 基本上想要使用图像制作教程风格的分页视图 并在用户从上一页滑动到 下一页 后关闭 UIViewController pageViewController U
  • Applet 生命周期:init() 和 start() 以及 destroy() 和 stop() 之间的实际区别是什么?

    The javadoc http download oracle com javase 6 docs api java applet Applet html and tutorial http download oracle com jav
  • Spring Boot Web 服务客户端身份验证

    我的目标是调用需要身份验证的 Web 服务 当我在浏览器中打开其 wsdl 时 浏览器会要求我登录名 密码 作为基础 我使用来自this https spring io guides gs consuming web service 教程
  • 如何防止docker搜索docker hub

    我正在建立一些 docker 主机在生产环境中运行 我们希望所有镜像都必须通过容器管道 并且我们不希望能够从 Docker Hub 中提取镜像 安全问题 如何阻止 docker 从 dockerhub 提取镜像 理想情况下 我想通过配置 d
  • 每组具有归一化 y 轴的计数图

    我想知道是否可以创建 Seaborn 计数图 但不是显示 y 轴上的实际计数 而是显示其组内的相对频率 百分比 如指定的那样 hue范围 我用以下方法解决了这个问题 但我无法想象这是最简单的方法 Plot percentage of occ
  • 如何在 Tomcat 中部署 Spring Integration 应用程序?

    我已经经历了 10 分钟内进行 Spring 集成 http blog springsource com 2009 02 13 982 设置基本 Spring Integration 应用程序的教程 我想在 Tomcat 中部署此应用程序
  • HttpClient / .NET Core 不支持的媒体类型

    我正在使用支持 JSON 格式的 POST 请求的 RESTful API API 自己的 Swagger 文档显示这是对其端点之一的有效调用 curl X POST header Content Type application json
  • 如何禁用 OpenCV 中的并行性?

    我已经使用 Intel IPP 构建了 OpenCV 因此我认为只要有可能就会使用它 例如矩阵乘法 我想通过与串行版本进行比较来测试并行应用程序的可扩展性 为了做到这一点 当我这样做时 omp set num threads 1 cv se
  • 有没有办法在地图中进行流式传输?

    我有一个文件 其中的映射条目由行分隔 键和值由 分隔 所以类似于 one 1二 2三 3四 4 我在一个名为 dict 的 ifstream 中打开它 然后运行以下代码 string key value map lt string int
  • Git 配置别名不再起作用

    我使用命令 git config global alias st status 按照帖子的建议添加我的第一个别名 如何在 git 中为命令添加别名 https stackoverflow com questions 2553786 how
  • javascript nextsibling 函数

    p This PARAGRAPH has two nodes b Node One b and b Node Two b p p p
  • 在 Swift 中传递和存储闭包/回调

    我想用快速代码执行以下操作 我必须调用我的 api 才能更新几个项目 所以我异步调用每个项目的 api 每个 api 调用完成后都会执行一个回调函数 这些回调会减少计数器的值 这样当计数器达到 0 时我就知道所有 api 调用都已完成 当计