2017-04-05 13 views
0

私は、セグ機能の準備で呼び出される非同期関数(geocodeAddressString)を持っています。問題は、この非同期関数が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

チップをありがとう。できる限り進捗インジケーターを避けることを好みますが、負荷が避けられない状況では、そのフレームワークを念頭に置いていきます。 –

関連する問題