2017-04-05 77 views
0

我有一個異步函數(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") 
    } 
} 

回答

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 
    } 


} 
0

你可以代替傳遞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) { ... } 
} 

如果geocodeAddressString花費的時間太長(和影響UX),你也可以把建立進度指標。例如,MBProgressHUD是這類任務的一個非常常見的框架。

+0

感謝您的提示。我希望儘可能避免使用進度指示器,但在任何情況下,我都會記住這個框架,以防止加載不可避免。 –