如何从 Swift 中的 void 闭包返回值?

2023-12-29

我有一个函数可以查询某个用户以访问该用户的数组。我返回用户并且可以访问他们的数组。但是,该调用是异步的,返回的值为零。该函数总体上有一个完成处理程序,但是,内部有一个查询调用,并且默认情况下该查询返回 Void。

    func _getAllMatches(completionHandler: ((UIBackgroundFetchResult) -> Void)!) -> Int{
    var toReturn = [GTLUserUser]()
    let query = GTLQueryUser.queryForUserList()
    query.userBucket = "messages-20-messagestabletes-1465782960"
    service.executeQuery(query, completionHandler: {(ticket, response, error) -> Void in
        if error != nil{
            self._showErrorDialog(error)
            return
        }
        else{
            let userCollection = response as! GTLUserCollection
            if let newUsers = userCollection.items() as? [GTLUserUser]{
                toReturn = newUsers
                completionHandler(UIBackgroundFetchResult.NewData)

            }
        }
    })

return toReturn[0].likedArray.count
}

我如何等待此查询返回并分配给“toReturn”,以便它实际上返回一些内容而不是不返回任何内容。


由于它是异步方法,因此您无法返回值,而是遵循完成处理程序模式,包括作为参数返回的数据:

func performAllMatchesQueryWithCompletionHandler(completionHandler: (UIBackgroundFetchResult, [GTLUserUser]?, ErrorType?) -> ()) {
    let query = GTLQueryUser.queryForUserList()
    query.userBucket = "messages-20-messagestabletes-1465782960"
    service.executeQuery(query) { ticket, response, error in
        guard error == nil else {
            completionHandler(.failed, nil, error)
            return
        }

        if let userCollection = response as? GTLUserCollection, let newUsers = userCollection.items() as? [GTLUserUser] {
            completionHandler(.newData, newUsers, nil)
        } else {
            completionHandler(.noData, nil, nil)
        }
    }
}

我从你的使用推断UIBackgroundFetchResult,您正在执行后台提取。如果是这样,你的performFetchWithCompletionHandler可能看起来像这样:

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    performAllMatchesQueryWithCompletionHandler { fetchResult, users, error in
        switch fetchResult {
        case .failed:
            // do whatever you want if there was an error

        case .noData:
            // do whatever you want when there is no data

        case .newData:
            // do whatever you want with `users`, presumably updating your model or what have you
        }

        completionHandler(fetchResult)
    }
}

然后你可以从调用这个方法viewDidLoad或任何适合您的应用程序的地方。

请注意,我删除了方法名称上的前导下划线,因为这不是 Swift 中的常见约定,但您可以随意调用您的方法。而我又重新命名了_getAllMatches to performAllMatchesQueryWithCompletionHandler,因为它更清楚地表明您正在执行异步查询。


在评论中,您说您没有进行后台提取,而是正在填充表。所以你可能会这样做:

func retrieveDataForTableView(tableView: UITableView) {
    performAllMatchesQueryWithCompletionHandler { fetchResult, users, error in
        switch fetchResult {
        case .failed:
            // do whatever you want if there was an error

        case .noData:
            // do whatever you want when there is no data

        case .newData:
            // do whatever you want with `users`, presumably updating your model or what have you

            // once you've updated your model, you can reload the table:

            tableView.reloadData()
        }
    }
}

请注意,我假设此完成处理程序正在主线程上运行。如果没有,你会想要dispatch_async(dispatch_get_main_queue()) { ... }更新模型并调用的代码reloadData.

就我个人而言,我不会倾向于使用UIBackgroundFetchResult for my performAllMatchesQueryWithCompletionHandler如果我没有真正进行后台获取。我可能会使用我自己的枚举,以避免对该代码的意图产生任何混淆。

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

如何从 Swift 中的 void 闭包返回值? 的相关文章

  • Swift MKAnnotationView 旋转

    我试图在坐标更改时旋转我的自定义注释 我可以成功地更改坐标 但尝试了一切方法来旋转它 但没有成功 基本思想是有一个平面并通过旋转设置其方向 这是我的代码 import UIKit import MapKit class CustomPoin
  • 在 iOS Cocoa 静态库项目中使用 Objective-C 代码,在 iOS 应用程序项目中使用 Swift 代码

    我正在寻找一个简单的过程 用于将共享库项目中的 Objective C 代码与应用程序项目中的 Swift 代码相结合 但到目前为止 此序列尚未成功 启动Xcode 6 1 1 创建工作区测试 创建iOS Cocoa Touch静态库项目T
  • 配置 Eclipse 将 App Engine 类预先捆绑到单个 JAR 中以加快预热速度

    在与另一家同样使用 App Engine 的公司的同事进行讨论后 他告诉我 他通过以下步骤成功地将应用程序预热时间从约 15 秒缩短到约 5 秒 配置 Eclipse 将编译过程中生成的类捆绑到单个 JAR 文件中 配置 Eclipse 以
  • 修改多张照片时只有一个 iOS 权限对话框

    我的应用程序允许用户从相机胶卷中选择多个图像并对这些图像应用编辑 但是 它会提示用户获得每个图像编辑的权限 编辑用户图像时是否可以只显示一个权限对话框 如果是 我该如何将我的编辑分组为一项权限 这是我的应用程序的屏幕截图 我在应用商店中发现
  • 在 Swift 中使用显式对象类型迭代数组

    我有一个数组 let individualScores 75 43 103 87 12 我这样迭代 for score in individualScores 但是 有没有办法显式声明对象类型呢 我认为以后使用自定义对象或其他原因它会派上用
  • 变量 p 在初始化之前通过引用传递

    我有一个 Human 类 它的函数可以接受任意数量的人 并确定某人是否比这些人中的任何人年长 然后返回一个包含他 她比其年长的人的数组 func isOlderThan people Human gt Human var p Human f
  • 如何在 iOS 11 上的 Swift 中获取 FLAC 文件元数据?

    我需要获取 FLAC 文件的元数据 我尝试了以下代码 let item AVPlayerItem url URL fileURLWithPath path let commonMetadata item asset commonMetada
  • Xcode 10 / iOS 12 中不遵守锚点约束

    昨天这一切都在 Xcode 9 和 iOS 11 下运行 但是 更新到 Xcode 10 和 iOS 12 后 该视图不再显示 我正在视图中显示视频 今天我能听到但看不到视频 我检查了框架 发现它为零 这解释了问题 但是 与之前的版本相比没
  • 如何在 Swift 3 中记录函数闭包参数的参数?

    在 Xcode 8 beta 和 Swift 3 中 当您有一个采用闭包作为参数的方法时 例如 func foo bar String gt Void bar Hello world 如何记录闭包所采用的参数 例如 如果我这样写 Calls
  • 何时使用 takeUnretainedValue() 或 takeRetainedValue() 来检索 Swift 中的非托管对象?

    根据将 Swift 与 Cocoa 和 Objective C 结合使用 https developer apple com library prerelease ios documentation Swift Conceptual Bui
  • 在 UIScrollView Swift 中禁用垂直滚动

    不要将此问题标记为重复 我读了很多问题 但没有找到问题的答案 我的问题如下 我有一个UIScrollView它应该只水平滚动 这里它垂直滚动 20px 奇怪的事实 它似乎与状态栏的高度相同 我尝试打印内容大小 y 偏移量和高度UIScrol
  • SwiftUI 中如何防止键盘推高视图? [复制]

    这个问题在这里已经有答案了 我是 SwiftUI 编程新手 我已经创建了一个视图 但是一旦用户点击文本字段 键盘就会出现 整个视图就会向上推 我该如何解决这个问题 我相信你可以使用 ignoresSafeArea keyboard 我在 X
  • 无法将项目添加到 UIView xib 内的 UICollectionView

    客观的 我想将我的 BusinessViewTableHeader UIView 作为 tableView 标题 tableView tableHeaderView BusinessViewTableHeader instanceFromN
  • 如何设置 ndb keyProperty

    我在理解实体和键在 Google App Engine NDB 中的工作方式时遇到一些困难 我有一个post实体和一个user实体 我该如何设置user key on post to user 到目前为止 在交互式控制台中 我有以下内容 f
  • Google App Engine Java:如何删除未使用的索引?

    如果我发现有关删除未使用的索引的信息 例如上传和管理Python应用程序 删除未使用的索引 http code google com appengine docs python tools uploadinganapp html Delet
  • 使用 Google App Engine 发送时的 Gmail 发送配额

    Gmail 规定每天 500 个收件人发送电子邮件的配额 如果您通过他们的 POP IMAP 界面发送 则配额仅为每天 100 个收件人 使用 Google 应用引擎在 Gmail 帐户上发送电子邮件的发送配额是多少 它会遵循 POP IM
  • Swift 中的“is”关键字

    据我所知 似乎共识是is在 Swift 关键字中是同义词isKindOfClass method 但是 我在执行以下操作时遇到困难 inside of a method in UITabViewController check if the
  • 关闭模态视图控制器时如何保持呈现视图控制器的方向?

    我正在开发这个应用程序 我需要所有视图控制器 但只有一个是纵向的 单一视图控制器很特别 我需要它能够旋转到手机所在的任何方向 为此 我以模态方式呈现它 未嵌入导航控制器中 所以 例如 我的结构是这样的 window Portrait roo
  • Xcode 6 无法在 Swift 中自动完成

    我正在尝试导入各种库 但我不记得它们的确切名称 很遗憾Xcode6 使用swift 不会像中那样自动完成它们Xcode5 使用objective c 例如 ALAssetsLibrary MPMediaPlayer etc 我被迫用谷歌搜索
  • 错误:Jenkins 中“没有这样的模块

    我正在尝试设置JenkinsSlave 构建我的 Swift 项目 该项目使用名为 Freddy 的 Swift pod 问题是构建失败并出现错误 错误 没有这样的模块 Freddy 这是我的 Podfile platform ios 8

随机推荐

  • Grunt Concat Task,如何忽略所有.min.js文件?

    我有以下 grunt concat 任务 如何使 concat 忽略所有缩小的文件 这是行不通的 concat js src js min js js min js dest foo f
  • 如何加快左右方向键编辑文本的速度? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是只有我一个人觉得这样 还是其他人发现 MacOS 上的左右箭头键编辑文本的速度异常缓慢 与我的 Windows 机器相比 在 Mac 上使用左 右箭
  • 如何从sqlx获取最后插入行的id?

    我想使用以下命令取回插入 MySql 数据库的最后一篇文章的 idsqlx resultPost err shared Dbmap Exec INSERT INTO post user id description link VALUES
  • Java:log4j 初始化错误

    我是 log4j 包的新手 但没有看到错误 这是一个非常简单明了的代码示例 import org apache logging log4j LogManager import org apache logging log4j Logger
  • 包含每个标头是否会对性能产生影响?

    可以说我想使用hex 功能 我知道它是定义在
  • npm iOS-deploy 安装问题

    npm WARN 生命周期 电子邮件受保护 cdn cgi l email protection 预安装 无法在 wd s s 中运行 wd s 电子邮件受保护 cdn cgi l email protection src scripts
  • Environment.CurrentDirectory 和 Directory.GetCurrentDirectory 之间有什么区别?

    在 NET 中 以下之间有什么区别 Environment CurrentDirectory Directory GetCurrentDirectory 当然 Environment CurrentDirectory是可以设置和获取的属性
  • 数组中的总和和“未定义的索引”

    我想在我的数组中求和
  • 将字符矩阵转换为数字矩阵

    我有一个 7 x 31 字符矩阵 称为extra4它的结构如下所示 gt str extra4 chr 1 7 1 31 36 88 45 48 52 46 111 31 138 45 121 09 122 62 attr dimnames
  • sql超时已过期

    日志记录 System Data SqlClient SqlException 超时已过期 这 操作完成之前超时时间已过或 服务器没有响应 我是一个初学者 当我在应用程序日志文件中看到上述错误时 这是 我看到的最常见的错误 而且每天都会重复
  • ASP.NET Web API 的 JWT 身份验证

    我试图在我的 Web API 应用程序中支持 JWT 不记名令牌 JSON Web 令牌 但我迷路了 我看到对 NET Core 和 OWIN 应用程序的支持 我目前在 IIS 中托管我的应用程序 如何在我的应用程序中实现此身份验证模块 有
  • 仅获取电子邮件文本的可靠方法,不包括以前的电子邮件

    我正在创建一个基本系统 允许用户通过电子邮件回复网站上的帖子 但是 大多数电子邮件客户端在回复电子邮件中包含之前电子邮件的文本 该文本在网站上是不需要的 有没有一种可靠的方法可以让我在不事先了解早期电子邮件的情况下仅提取新邮件 我正在使用e
  • 识别隐式强制转换和显式强制转换[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果有人能回答我的问题 我将不胜感激
  • 如何在 Spring Boot 测试中设置“headless”属性?

    我正在使用 Spring Boot 和 JavaFX 进行测试 基于一些优秀的 YouTube 视频 https www youtube com watch v hjeSOxi3uPg这解释了这一点 为了使其与TestFX https gi
  • Angular.js 子目录中的路由

    是否可以以从部署该应用程序的 Web 目录路径中抽象的方式来开发 Angular js 应用程序 我正在尝试将 Angular js 应用程序放入 Web 服务器子目录中http example com myproject http exa
  • Firestore ID 在整个数据库中是否唯一[重复]

    这个问题在这里已经有答案了 我的意思是 如果我们从所有集合和子集合等中收集所有 id 自动生成 它们都是唯一的吗 做什么的 我正在构建一个新功能 用户可以在其中共享子集合中的项目 所以我不确定 我可以在用户子集合之间使用相同的 id 吗 T
  • Laravel 雄辩关系:->latest()

    laravel中latest 的作用是什么 Example public function activity return this gt hasMany App Activity gt with user subject gt lates
  • 如何强制 PHP 使用字符串作为数组键? [复制]

    这个问题在这里已经有答案了 我遇到过一个旧应用程序 它使用 id 来命名类型数组 例如 array 1 280 gt string 3 abc 现在我需要重新排序这些 并且var dump 当键是整数时 这看起来不会发生 如果我添加一个a对
  • 使用 AcquireTokenSilent 刷新 access_token

    我有一个 asp net core MVC 应用程序 它将 access token 传递给下游 API 经过一番努力 我弄清楚了如何使用 MSAL Net 获取 access token 但访问令牌每小时都会过期 因此我必须刷新它 所以我
  • 如何从 Swift 中的 void 闭包返回值?

    我有一个函数可以查询某个用户以访问该用户的数组 我返回用户并且可以访问他们的数组 但是 该调用是异步的 返回的值为零 该函数总体上有一个完成处理程序 但是 内部有一个查询调用 并且默认情况下该查询返回 Void func getAllMat