如何在闭包中调用函数

2023-11-30

在模特的课堂上Location,我得到当前城市的名称:

var currentLatitude: Double!
var currentLongitude: Double!
var currentLocation: String!
var currentCity: String!

func getLocationName() {

    let geoCoder = CLGeocoder()
    let location = CLLocation(latitude: currentLatitude, longitude: currentLongitude)

    geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
        guard let addressDict = placemarks?[0].addressDictionary else {
            return
        }
        if let city = addressDict["City"] as? String {
            self.currentCity = city
            print(city)
        }
        if let zip = addressDict["ZIP"] as? String {
            print(zip)
        }
        if let country = addressDict["Country"] as? String {
            print(country)
        }

        self.nowUpdateUI()
    })
}

在视图控制器中,我想更新 UI 并更新标签以显示当前城市。 然而,self.currentCity = city发生在闭包内部。因此,如果我只是在视图控制器中运行一个函数:

func updateUI() {
        cityLbl.text = Location.sharedInstance.currentCity
}
  • 我什么也没得到,因为关闭还没有完成运行。 建议我添加一个完成处理程序getLocationName()在其中,执行对将更新 UI 的函数的调用。 然而,从所有关于闭包、完成处理程序的教程中,我不清楚如何实现这一点。 如何构造完成处理程序,将其作为参数传递给getLocationName()以及如何打电话getLocationName从视图控制器?

要处理这种情况,您有多种选择。

  1. Create delegate/protocol与您的位置类别

    • 创建一个协议并使用您的实现该协议方法ViewController并在你的中声明它的实例Location班级。之后在completionHandler of reverseGeocodeLocation调用这个委托方法。检查 Apple 文档Protocol更多细节。
  2. 您可以创建completionHandler和你的getLocationName的方法Location class.

    • Add completionHandler with getLocationName并称之为completionHandler在 - 的里面completionHandler of reverseGeocodeLocation像这样。

      func getLocationName(completionHandler: @escaping (_ success: Bool) -> Void) {
      
          let geoCoder = CLGeocoder()
          let location = CLLocation(latitude: currentLatitude, longitude: currentLongitude)
      
          geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
              guard let addressDict = placemarks?[0].addressDictionary else {
                  completionHandler(false)
                  return
              }
              if let city = addressDict["City"] as? String {
                  self.currentCity = city
                  print(city)
              }
              if let zip = addressDict["ZIP"] as? String {
                  print(zip)
              }
              if let country = addressDict["Country"] as? String {
                  print(country)
              }
              completionHandler(true)
              //self.nowUpdateUI()
          })
      }
      

      Now in ViewController你在哪里调用这个函数调用你的updateUI完成块内的方法。

      Location.sharedInstance.getLocationName { (success) in
          if success {//If successfully got response
              self.updateUI()
          }
      }
      
  3. 您可以添加观察者(NS)NotificationCenter.

    • 注册观察者(NS)NotificationCenter然后将通知发布在completionHandler of reverseGeocodeLocation。您可以通过此获得更多详细信息StackOverflow 帖子.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在闭包中调用函数 的相关文章

  • iOS11视觉框架映射所有人脸特征点

    我正在使用视觉框架并使用以下代码获取所有里程碑点 if let allFaceLandmarks landmarks allPoints print allFaceLandmarks 但无法找到这些点的映射 例如右眼的索引号 寻找相同的东西
  • Swift UIToolBar 追加 UIBarButtonItem 项目

    我的语法不正确 有人知道这里缺少什么吗 我正在使用 Xcode 6 beta 3 并且尝试将工具栏项动态添加到 viewDidLoad 中的 手动添加的 工具栏 有两个问题 首先 我无法将工具栏中的项目附加到数组中 其次 虽然编译器允许我调
  • 删除 UISearchBar 中的清除按钮

    我想从 UISearchBar 中删除清除按钮 灰色 x 我尝试按照中的描述进行操作这个答案 https stackoverflow com a 19458201 但它不起作用 我将 Objective C 代码从下面的答案和评论翻译为以下
  • JRuby:带有 Ruby 块的 Java 命令模式:为什么它有效?

    我正在学习如何将 Java 库与 Ruby 代码集成 并提出以下问题 我有一个用Java实现的命令模式 如下所示 public interface Command public String execute String param pub
  • 如何以编程方式创建 Unwind segue

    我制作了一个不使用故事板的应用程序 在我的应用程序的这一部分中 我需要创建一个展开转场ThirdViewController to FirstViewController仅以编程方式 我知道如何使用 sotorybard 执行此操作 但找不
  • Swift 2.1- tabBarController!.selectedIndex 返回大整数

    我需要把tabBarController selectedIndex常量内的数字 我期望一个介于 0 和 3 之间的数字 具体取决于我选择的选项卡 但我得到的数字如下2147483647 有什么想法吗 代码是 let selectedTab
  • 带 cookie 的 Alamofire 请求

    我是初学者 我不知道如何使用 Alamofire 发出 GET 请求 但它需要身份验证 我设法用其他网络服务 登录 来做到这一点 因为它需要参数参数 parameters username username password passwor
  • UICollectionView 快速粘性标题

    我正在尝试创建一个粘性补充标题 它始终保持在顶部并且不会响应滚动事件 到目前为止 我发现的解决方案仍然对弹跳滚动做出反应 并使用自定义 flowLayout 进行修复 这也可能是我的问题的修复 我想要这种方式的原因是标头在其他地方使用并且应
  • 检查 switch 语句中的可用性

    if a Enum输入添加新的case在新的操作系统版本中 如何检查可用性switch陈述 像一个Enum in StoreKit below public enum Code Int public typealias ErrorType
  • 使用 Swift 创建 SKSpriteNode 子类

    我正在尝试创建作为 SKSpriteNode 子类的类 并且我想向其添加其他属性和函数 但在第一步中我遇到了错误 这是我的代码 import SpriteKit class Ball SKSpriteNode init super init
  • cllocation 和 mkreversegeocoder

    我尝试使用 cllocation 和 mkreversegeocoder 检索城市名称 在我的 viewdidload 方法中 我是 cllocationmanager self locManager CLLocationManager a
  • 应用程序图标上的快捷方式项目不适用于 iOS 13

    为了支持应用程序图标上的快捷方式项目 我们在中实现了以下方法SceneDelegate func windowScene windowScene UIWindowScene performActionFor shortcutItem UIA
  • 如何查看iOS11屏幕录制是否开启?

    为了检测 iOS11 屏幕录制功能的开或关 我使用了 isCaptured 和 UIScreenCapturedDidChange 通知 当我第一次启动应用程序并在 iOS11 内置屏幕录制功能上时 它会通知选择器方法 值为 True 但是
  • 获取键盘高度在 iOS 11 beta 上不起作用

    我有以下在 IOS 10 上运行的代码 但现在在 IOS 11 beta 上运行时不再运行 if let userInfo notification userInfo if let keyboardSize userInfo UIKeybo
  • 两个 UIBezierPaths 交集作为 UIBezierPath

    我有两个UIBezierPaths 一个表示图像部分的多边形 另一个是要在其上绘制的路径 我需要找到它们之间的交集 以便只有该交集区域内的点才会被着色 有没有方法在UIBezierPath可以找到两条路径之间的交点 或新路径 我不知道获取作
  • Swift MKAnnotationView 旋转

    我试图在坐标更改时旋转我的自定义注释 我可以成功地更改坐标 但尝试了一切方法来旋转它 但没有成功 基本思想是有一个平面并通过旋转设置其方向 这是我的代码 import UIKit import MapKit class CustomPoin
  • 转换任何对象?到字符串

    我有一个返回 AnyObject 的函数 func aFunction param String gt AnyObject 如何将其转换为字符串 和字符串 尝试这个 if let result aFunction test as Strin
  • Swift 中的条件导入

    我有一个在各种应用程序中使用的日志功能 由于我在整个应用程序中使用它 因此也可以方便地进行 Crashlytics 日志记录调用 然而 并非每个应用程序都使用 Crashlytics 在 Objective C 中 您可以使用预处理器条件来
  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置
  • 无法更改 UITabBarItem.image:CSI 中不支持的像素格式

    我试图通过代码更改选项卡栏中显示的图像 我目前正在使用 Swift 和 Xcode 6 beta 3 我导入了 tabBarImage png 并 电子邮件受保护 cdn cgi l email protection在 Images xca

随机推荐

  • 如何在 Google Chrome JavaScript 控制台中打印调试消息?

    如何在 Google Chrome JavaScript 控制台中打印调试消息 请注意 JavaScript 控制台与 JavaScript 调试器不同 他们有不同的语法 AFAIK 所以printJavaScript 调试器中的命令在这里
  • 如何使用 file_get_contents() 加载远程文件?

    现在这让我有点挠头 我正在尝试从远程 URL 获取文件 我可以保存本地文件的内容 但不能保存远程文件的内容 这有效 file put contents file1 xml file get contents file2 xml 这不会 fi
  • 配置中的 req_extensions 和命令行上的 -extensions 有什么区别?

    示例 openssl root ca 配置来自OpenSSL 食谱定义如下 p40 req req extensions ca ext ca ext 稍后 p43 生成根 ca 密钥 然后生成根 ca 自签名证书 openssl req n
  • 错误:无法加载默认凭据(Firebase 函数到 firestore)

    我正在尝试为 Firebase Cloud Functions 编写一个 onCall 函数 该函数在 firestore 数据库上执行高级查询任务 即根据 AutoML 自然语言检查文本查询以获取类别等 但在尝试查询来自函数的数据库 Er
  • ActionScript MXML

    看起来我可以同时使用组件
  • 读取带有 chrome 扩展名的本地文件的内容

    我正在为 chrome 浏览器开发一个扩展 我使用 KangoExtensions 框架 该扩展是用 JavaScript 编写的 我想读取位于本地文件系统上的文件的内容 实现这个最简单的方法是什么 如果您已经知道文件系统中文件的路径 则只
  • 使用WebClient访问本地文件

    我开发了一个 C 应用程序 需要通过 HTTP FTP 以及有时还通过本地文件 file 访问许多不同的内容源 我希望有一个统一的方式通过不同的协议访问这些文件 因此我选择了 WebClient 来执行此操作 它适用于 MSDN 上记录的所
  • ListView 行中的 ViewFlipper

    我有一个 ListView 其中每行都有一个 XML 视图 每行都有一个 ViewFlipper 和一个 Button 其目的是按下按钮并翻转 ViewFlipper 上的视图 问题是我无法让按钮翻转正确的 ViewFlipper 我正在
  • NSNumber floatValue 不等于 NSNumber 值

    第一篇文章在这里 NSNumber 的 floatValue 方法有问题 不知何故 它返回一个不精确的数字 问题是这样的 我将一堆 NSNumber 存储在一个数组中 如下所示 NSArray a NSArray arrayWithObje
  • 如何将多个ViewPager放入一个ScrollView中?

    我正在尝试实现一个布局 其中包含 ViewPagers 列表 每个 ViewPager 都可以独立滑动 请参阅下图的链接 布局图片 我尝试使用 ScrollView 和一个带有 ViewPagers 的 LinearLayout 但我只显示
  • 根据与 dplyr::select 兼容的类/类型选择列

    实际问题 如何定义一个选择助手 根据其类 类型选择列并且也与dplyr的架构 尽职调查 我看过https cran r project org web packages dplyr vignettes introduction html以及
  • ASP.NET MVC 3 Ajax.BeginForm 和 Html.TextBoxFor 不反映在服务器上完成的更改

    我使用 ASP NET MVC3 中的 Ajax BeginForm 帮助程序提交一个表单 该表单将自身替换为服务器上表单集中的新值 但是 当我使用 Html TextBoxFor 之类的帮助程序时 我得到的是提交的值 而不是我插入到服务器
  • 遍历 4 个数字的组合

    我需要一个代码来运行 4 个数字的可能组合 例如 1234 将产生 1234 1243 1324 等的 24 种组合 但不做 1 12 123 ect 我希望它只有 4 个数字长度组合 只是改变顺序 一个很长的选择是 import rand
  • 张量流可以扫描并只保留最终结果吗?

    以下代码计算数组的总和tf scan 张量流会分配一个 6 元素数组来保存六个部分和吗 或者 tensorflow 足够聪明 只分配一个 1 元素数组来保存部分和 如何确定 import tensorflow as tf import nu
  • 未捕获的类型错误:firebase.auth 不是函数

    我尝试使用 firebase 电子邮件和密码 构建一个身份验证应用程序 但我对 firebase 方法有问题 当我致电 firebase auth 时 他们说 这不是一个函数 是因为我的项目和 firebase SDK 没有链接吗 您有什么
  • 多边形顶点 - 顺时针或逆时针

    我发现了这个链接http www mathopenref com coordpolygonarea2 html 它解释了如何计算多边形的面积 并有助于识别我们输入的多边形顶点是顺时针还是逆时针 如果面积值为 ve 则为顺时针方向 如果为 n
  • PHP 登录本机控制台 Firefox Developer

    与 Firebug 相比 我更喜欢 Firefox 开发者检查器 但是可以在原生 JS 控制台中显示 PHP 日志吗 谢谢 我刚刚安装了 Chrome Logger github website with Chrome PHP由于 Fire
  • 测试具有 CSRF 保护的 scala Play (2.2.1) 控制器

    我在测试使用 Play 的 CSRF 保护的控制器时遇到了一些问题 为了演示这一点 我创建了一个非常简单的 Play 应用程序 以最小程度地展示该问题 https github com adamnfish csrftest 完整的详细信息位
  • 无法满足从 com.lmax.disruptor 3.2.0 到包 sun.misc 0.0.0 的依赖关系

    我正在开发一个 eclipse 插件 需要 com lmax disruptor 它导入 sun misc 我的 p2 存储库中有这个 但是当我 Maven 构建我的插件时 我收到此错误 无法满足从 com lmax disruptor 3
  • 如何在闭包中调用函数

    在模特的课堂上Location 我得到当前城市的名称 var currentLatitude Double var currentLongitude Double var currentLocation String var current