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

时间:2017-04-05 01:11:25

标签: ios swift asynchronous

我有一个在准备segue函数中调用的异步函数(geocodeAddressString)。问题是这个异步函数在执行segue后返回。下面的异步函数将地址字符串转换为坐标。在准备功能之前我无法调用此异步功能,因为用户可以随时编辑用户地址字段。我在按下保存按钮时尝试调用异步函数,然后在异步函数返回时编码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")
    }
}

2 个答案:

答案 0 :(得分:1)

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

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
    }


}

答案 1 :(得分:0)

您可以改为传递addressTxt.text!,然后在下一个视图控制器中调用异步方法

当前视图控制器中:

homeViewController.isReturningSegue = true
homeViewController.tempItem = self.donatedItem
homeViewController.address = self.addressTxt.text!

next 视图控制器中:

func viewWillAppear() {
    supper.viewWillAppear()
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(self.address) { ... }
}

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