当前位置: 首页 > 知识库问答 >
问题:

完成处理程序异步

刘升
2023-03-14

我的完成处理程序有问题。下面是一个带有完成处理程序的函数,位于一个实用程序文件中:

func convertGeopointToCity(geopoint: PFGeoPoint, complete: (city: String, error: NSError?) -> Void) {
    var city = ""
    let latitude = geopoint.latitude
    let longitude = geopoint.longitude
    let location: CLLocation = CLLocation(latitude: latitude, longitude: longitude)

    CLGeocoder().reverseGeocodeLocation(location, completionHandler: { placemarks, error in

        if (error == nil) {

            if let p = CLPlacemark?(placemarks![0]) {

                if let city = p.locality {
                    city = " \(city)!"
                    print("Here's the city:\(city)")
                    complete(city: city, error: nil)
                }
            }
        }
    })
}

我在视图控制器中调用它

    LocationUtility.instance.convertGeopointToCity(geopoint, complete: { result, error in
        if error != nil {
            print("error converting geopoint")
        } else {
            city = result as String
        }
    })
    print("The city: \(city)")

输出清楚地表明该函数在运行该块之前没有等待完成:

The city: 

Here's the hood Toronto!

我如何解决这个问题?

共有1个答案

傅翰池
2023-03-14

您应该将您的处理程序放在块内:

LocationUtility.instance.convertGeopointToCity(geopoint, complete: { result, error in
    if error != nil {
        print("error converting geopoint")
    } else {
        city = result as String
        // do other stuff here, or call a method 
        print("The city: \(city)")
    }
})

CLGeocoder()。反向定位是异步的。完成块在地理代码完成后立即调用,更可能是在打印后。

您应该在由完整块调用的另一个函数中执行操作,或者向块本身添加一些代码。

 类似资料:
  • 问题内容: 使用AlamoFire框架后,我注意到完成处理程序在主线程上运行。我想知道下面的代码是否是在完成处理程序中创建Core Data导入任务的好习惯: 问题答案: 这是一个非常好的问题。您的方法是完全有效的。但是,Alamofire实际上可以帮助您进一步简化此流程。 您的示例代码调度队列细分 在示例代码中,您将在以下调度队列之间跳转: NSURLSession分派队列 TaskDelega

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

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

  • 我正在尝试在我的Swift应用程序中创建一个服务对象,以便更轻松地处理请求。我已经把它连接起来了,但是我可能误解了完成处理器。 我有这个函数,它只是发布到我正在运行的本地APIendpoint。 我需要做的就是把这个名字传给我在这里做的函数 但是,我现在收到此错误。 调用中缺少参数“completion”的参数 我的目标是返回< code>Response对象,这样我就可以访问它的属性,在UI中做

  • 问题内容: 我正在试图做的是传递给函数,然后使用传递通过设置将返回。 我在中创建闭包时遇到了问题, 它引发了编译器错误/崩溃: 在斯威夫特,是根据文档应该包含的对象,就像Objective-C的版本。 这是我当前的代码: 编辑:似乎错误与不被视为数组有关。现在编译,但是我想集的时候得到什么,但无内。我检查了传递的,它们是有效的。 编辑2:打印后,我可以确认它返回了数据。但是仍然返回nil。 问题答

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