ios - Swift:for循环中的异步调用

标签 ios swift

我正在尝试快速执行以下操作 - 尝试反向解码数组中的地址列表并打印它们的纬度/经度坐标。我的代码如下。

    let addressArray = ["Address 1", "Address 2"]
    var coordinatesArray = [CLLocationCoordinate2D]()

    override func viewDidLoad() {
        super.viewDidLoad()
        createAddressList()
        printAddressList()
    }

    func printAddressList() {
        for i in 0 ..< addressArray.count  {
            print("Address = \(addressArray[i]) Coordinates = \(coordinatesArray[i].latitude),\(coordinatesArray[i].latitude)")
    }

    func createAddressList() {
        for i in 0 ..< addressArray.count {
            let address = addressArray[i]
            geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
                print("Address = \(address)");
                if let placemark = placemarks?.first {
                    let coordinate = placemark.location?.coordinate
                    self.coordinatesArray.append(coordinate!)
                }
            })
        }
    }
}

代码只打印第一个被解码的地址,然后什么也没有发生。

我确实有一个像下面这样的修复方法,就是像这样从 viewDidLoad 方法中移动 printAddressList 调用

func createAddressList() {
    if count < self.addressArray.count {
        let address = addressArray[count]
        geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in
            print("Address = \(address)");
            if let placemark = placemarks?.first {
                let coordinate = placemark.location?.coordinate
                self.coordinatesArray.append(coordinate!)
            }
            print("Count = \(self.count)")
            self.count += 1
            self.createAddressList()
        })
    } else {
        printAddressList()
    }
}

尽管后一种解决方案有效,但我发现它并不干净,想知道在使代码可读和干净的同时执行此操作的正确方法。

最佳答案

使用这个结构怎么样?

let workGroup = dispatch_group_create()

for i in 0..<addressArray.count {

    dispatch_group_enter(workGroup)

    performGeoCoding({  successCallback : 

            dispatch_group_leave(workGroup)

    })
}

dispatch_group_notify(workGroup, dispatch_get_main_queue()){ 
    successCallback()   
    printAddressList()                    
}

关于 dispatch_group 有很好的教程 here .

关于ios - Swift:for循环中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39633807/

相关文章:

ios - AVAudio Recorder 不在后台录音

objective-c - 无法在 iOS 中隐藏键盘

ios - iPhone 中的总内存

ios - 截取带有背景图片的屏幕截图 - iOS

ios - 使用闭包作为函数参数时,Swift 不带逗号的单独参数

swift - 是否可以让通话状态栏覆盖内容而不是将所有内容都向下移动?

ios - 如何在 Swift 中查询 PayUBiz

swift - 查找字符串中第 N 个单词的范围

iphone - 导航 Controller 内的 TableView : Zero Edge Insets on the Left and on the Right?

ios - 是否可以通过编程方式将 Google 翻译集成到 iOS App 中(Swift 4)?