2016-10-12 12 views
2

タスクを完了してから、Segueを実行して新しいページに移動したい。しかし何らかの理由でそれはSegueを実行せず、 "DOWNLOAD DONE"の前に "私はここにいます"と印刷します。タスクのシーケンス

class DownloadStocksVC: UIViewController { 

    var stocks = [Stock]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     DataService.ds.REF_BASE.child("stocks").observeEventType(.Value, withBlock: { snapshot in 
      print(snapshot.value) 

      if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 
       self.stocks = [] 
       for snap in snapshot { 

        if let stockDict = snap.value as? Dictionary<String, AnyObject> { 
         let symbol = snap.key 
         let stock = Stock(stockKey: symbol, dictionary: stockDict) 
         self.stocks.append(stock) 

        } 
       } 
      } 
      print("DOWNLOAD DONE") 
     }) 

     print("I AM HERE NOW") 
     self.performSegueWithIdentifier("goFromDownloadToTable", sender: nil) 

    } 
+0

「ダウンロード完了」後にあなたはなぜ演技しませんか? – adnbsr

答えて

2

ダウンロードが完了した後ではなく、segueを実行する必要があります。

performSegueへのコールを補完ブロックの最後に移動します。また、メインキューで実行する必要があります。

class DownloadStocksVC: UIViewController { 
    var stocks = [Stock]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     DataService.ds.REF_BASE.child("stocks").observeEventType(.Value, withBlock: { snapshot in 
      print(snapshot.value) 

      if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 
       self.stocks = [] 
       for snap in snapshot { 
        if let stockDict = snap.value as? Dictionary<String, AnyObject> { 
         let symbol = snap.key 
         let stock = Stock(stockKey: symbol, dictionary: stockDict) 
         self.stocks.append(stock) 

        } 
       } 
      } 

      print("DOWNLOAD DONE") 
      DispatchQueue.main.async { 
       self.performSegueWithIdentifier("goFromDownloadToTable", sender: nil) 
      } 
     }) 
    }