当前位置: 首页 > 面试题库 >

Swift-CLGeocoder reverseGeocodeLocation完成处理程序关闭

吕嘉赐
2023-03-14
问题内容

我正在试图做的是传递CLLocation给函数getPlacemarkFromLocation,然后使用传递CLLocation通过reverseGeocodeLocation设置CLPlacemark?将返回。

我在中创建completionHandler闭包时遇到了问题reverseGeocodeLocation 它引发了编译器错误/崩溃:

在斯威夫特,CLGeocodeCompletionHandlerCLGeocodeCompletionHandler = (AnyObject[]!, NSError!) -> Void根据文档AnyObject[]!应该包含CLPlacemark对象,就像Objective-C的版本。

这是我当前的代码:

class func getPlacemarkFromLocation(location:CLLocation)->CLPlacemark?{
    var g = CLGeocoder()
    var p:CLPlacemark?
    g.reverseGeocodeLocation(location, completionHandler: {
        (placemarks, error) in
        let pm = placemarks as? CLPlacemark[]
        if (pm && pm?.count > 0){
            p = placemarks[0] as? CLPlacemark
        }
    })
    return p?
}

编辑:似乎错误placemarks.countplacemarks不被视为数组有关。现在编译,但是我想集的时候得到什么,但无pcompletionHandler。我检查了CLLocation传递的,它们是有效的。

编辑2:打印后placemarks,我可以确认它返回了数据。但是p仍然返回nil。


问题答案:

我在此线程中找到了所需的答案:使用reverseGeocodeLocation:设置地址字符串,然后从方法返回

问题在于reverseGeocodeLocation异步的事实,方法p在我的示例中在completionBlock设置之前返回一个值。

根据要求,这是我当前的代码。

func showAddViewController(placemark:CLPlacemark){
    self.performSegueWithIdentifier("add", sender: placemark) 
}

func getPlacemarkFromLocation(location: CLLocation){
    CLGeocoder().reverseGeocodeLocation(location, completionHandler:
        {(placemarks, error) in
            if error {println("reverse geodcode fail: \(error.localizedDescription)")}
            let pm = placemarks as [CLPlacemark]
            if pm.count > 0 { self.showAddPinViewController(placemarks[0] as CLPlacemark) }
    })
}

我不想采取NSNotificationCenter路由,因为那样会增加不必要的开销,而是在completionHandler闭包内部调用了另一个函数,并将CLPlacemark生成的by
getPlacemarkFromLocation作为参数传递,以使事情保持异步,因为在placemarks设置函数之后将调用该函数(应该)获得所需的地标并执行所需的代码。希望我所说的有意义。



 类似资料:
  • 我目前正在学习swift,几个小时以来我一直在试图理解一个错误。由于查询,我试图从php脚本中获取一个xml文件,我使用一个完成处理程序作为回调来获取这些查询的结果。 问题是我对这些技术感到不舒服,它说缺少论据。 下面是使用完成处理程序的函数: 这是我调用这个函数的一段代码: 这段代码显示有关调用连接的此错误: 我做错了什么?为什么它要两个参数? 非常感谢您的帮助。 埃尔巴托

  • 我试图更准确地理解斯威夫特的“关闭”。 但是和太难理解了 我搜索了许多Swift帖子和官方文件,但我觉得这仍然不够。 这是官方文件的代码示例 听说使用< code>@escaping有两种方式和原因 第一个用于存储闭包,第二个用于异步操作目的。 以下是我的问题: 首先,如果执行,则将使用闭包参数执行,并且该闭包将保存在全局变量数组中。 我认为闭包是{self.x=100} {self.x=100}

  • 问题内容: 我在Utilities类中使用loadImage方法,并且在通过闭包返回图像时遇到了一些麻烦。基本上因为我的代码可能返回图像或错误,所以在调用该方法时将其分配给image属性是行不通的。 我在类的方法声明中使用的方法是否错误,还是应该以不同的方式调用该方法以预期潜在的不同结果?谢谢 问题答案: 将处理程序添加到您的 loadImage 函数中: 迅捷3 像这样调用func: 斯威夫特2

  • 问题内容: 我是Swift和SpriteKit的新手。SpriteKit Actions的许多示例都在Objective C中,在Swift中我无法映射到它,也无法使用。 如果运行SKAction,并且在完成SKAction后又想做其他事情,那么如何在Swift中做到这一点呢? 任何想法将不胜感激。 编辑: 问题答案: 您的完成代码不会被调用,因为您的“死亡”操作将永远运行,这意味着它永远不会结束

  • 问题内容: 我正在创建一个返回Dictionary的,但是当我在另一个类中调用此方法时,其值为nil。 然后,我尝试在另一个类中调用它,以便可以查看Dictionary 的值并基于该值显示数据。例如, 这里的问题是,当我调用函数时,我在尝试调用字典时收到一个值。 简而言之,我的问题是如何为完成处理程序分配值并在Xcode项目中的其他位置调用它? 问题答案: 您的问题很乱。您的示例代码无效,并且没有

  • 我的完成处理程序有问题。下面是一个带有完成处理程序的函数,位于一个实用程序文件中: 我在视图控制器中调用它 输出清楚地表明该函数在运行该块之前没有等待完成: 我如何解决这个问题?