我有一个在准备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")
}
}
答案 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是这类任务的一个非常常见的框架。