Ios 在不同视图中快速捕获异步函数

Ios 在不同视图中快速捕获异步函数,ios,swift,asynchronous,Ios,Swift,Asynchronous,我有一个异步函数(geocodeAddressString),它在prepareforsegue函数中被调用。问题是这个异步函数在segue执行后返回。下面的异步函数将地址字符串转换为坐标。我不能在这个prepare函数之前调用这个异步函数,因为用户可以随时编辑用户地址字段。我曾尝试在按下save按钮时调用async函数,然后在async函数返回时对segue进行编码,但是按下按钮和segue之间的加载时间太长 所以我的问题是,是否有任何方法可以在新视图中捕获此异步方法?然后我可以用实际返回的值

我有一个异步函数(geocodeAddressString),它在prepareforsegue函数中被调用。问题是这个异步函数在segue执行后返回。下面的异步函数将地址字符串转换为坐标。我不能在这个prepare函数之前调用这个异步函数,因为用户可以随时编辑用户地址字段。我曾尝试在按下save按钮时调用async函数,然后在async函数返回时对segue进行编码,但是按下按钮和segue之间的加载时间太长

所以我的问题是,是否有任何方法可以在新视图中捕获此异步方法?然后我可以用实际返回的值替换一些临时坐标。感谢您的帮助,谢谢

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {    
    //convert address to coordinates
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(addressTxt.text!) { (placemarks, error) in
        guard
            let placemarks = placemarks,
            let location = placemarks.first?.location
            else {
                // handle no location found
                return
        }

            let tempCoord = CLLocationCoordinate2D(latitude: (location.coordinate.latitude), longitude: (location.coordinate.longitude))
            self.donatedItem = DonatedItem(self.titleTxt.text!, self.itemImg.image!, self.donated, self.descTxt.text!, expirationDate, tempCoord, (user?.uid)!, (self.donatedItem?.itemID)!, self.addressTxt.text!, reserved: false, reservedBy: "NA")
            self.donatedItem?.updateItem()
    }

    switch(segue.identifier ?? "") {
    case "saveItem":

        homeViewController.isReturningSegue = true
        homeViewController.tempItem = self.donatedItem

    default:
        print("Undefined segue")
    }
}

你当然可以。发布通知以通知新视图。或者使用闭包。例如,这是通知

NotificationCenter.default.post(name: Notification.Name(rawValue: "locationUpdated"), object: coordinate)
这就是如何用闭包来实现这一点

typealias closure = (String) -> Void

class A: UIViewController {
    var coordinateUpdated: closure? // call this after coordinate updated

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let b = segue.destination as? B {
            coordinateUpdated = b.coordinateUpdated
        }
    }
}

class B: UIViewController {
    let coordinateUpdated: closure = { (coordinate: String) in
        // update here
    }


}

您可以改为传递
addressTxt.text
在当前视图控制器中:

homeViewController.isReturningSegue = true
homeViewController.tempItem = self.donatedItem
homeViewController.address = self.addressTxt.text!
func viewWillAppear() {
    supper.viewWillAppear()
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(self.address) { ... }
}
在下一个视图控制器中:

homeViewController.isReturningSegue = true
homeViewController.tempItem = self.donatedItem
homeViewController.address = self.addressTxt.text!
func viewWillAppear() {
    supper.viewWillAppear()
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(self.address) { ... }
}

如果
geocodeAddressString
花费的时间太长(并且影响用户体验),您还可以设置进度指示器。例如,对于此类任务来说,是一个非常常见的框架。

谢谢您的提示。我宁愿尽量避免使用进度指标,但对于无法避免加载的任何情况,我都会记住该框架。