2017-07-19 37 views
1

以下方法是我的刷新數據方法。它會從firebase中讀取最新的數據。因爲firebase不同步,所以我在endRefreshing等待5秒鐘後等待Firebase完成閱讀過程。如何在完成從Firebase加載時刷新UIRefreshControl端點

func refreshData() { 
    //Remove old data 
    self.items.removeAll() 
    //Renew all data 
    var ref: DatabaseReference! 
    ref = Database.database().reference(withPath: "tasks") 
    //Loading local drafts 
    var drafts : [Task]! 
    if let local_drafts = NSKeyedUnarchiver.unarchiveObject(withFile: Task.ArchiveURL.path) as? [Task] { 
     drafts = local_drafts 
    } 
    else{ 
     drafts = [] 
    } 
    //Reloading the database 
    ref.observe(.value, with: { snapshot in 
     var newItems: [Task] = [] 
     self.num_of_tasks = Int(snapshot.childrenCount) 
     for item in snapshot.children { 
      //let local = item as! DataSnapshot 
      //let snapshotValue = local.value as! [String: AnyObject] 
      //print(snapshotValue["main_content"] as! String!) 
      let taskItem = Task(snapshot: item as! DataSnapshot) 
      newItems.append(taskItem!) 
     } 
     let merged = drafts + newItems 
     self.items = merged 
     self.tableView.reloadData() 
     //Wait for 5 seconds 
     let deadlineTime = DispatchTime.now() + .seconds(3) 
     DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: { 
      self.refreshControl!.endRefreshing() 
     }) 
    }) 
} 

但由於有時所有的數據被加載,但清爽仍在繼續,這使得它奇怪,這不是一個很好的解決方案。有沒有辦法解決這種情況?使refreshControl結束刷新,直到我加載來自Firebase的所有數據?

回答

1

下面是一個方法來做到這一點。它將等待異步數據完成下載,並且當completionHandler返回true或false時,refreshControl將停止刷新。我在這裏沒有編譯器,所以我希望它能正常工作。

func viewDidLoad(){ 
refreshData{ _ in 
    self.refreshControl!.endRefreshing() 
} 
} 

func refreshData(completionHandler:@escaping (Bool)->()) { 
    //Remove old data 
    self.items.removeAll() 
    //Renew all data 
    var ref: DatabaseReference! 
    ref = Database.database().reference(withPath: "tasks") 
    //Loading local drafts 
    var drafts : [Task]! 
    if let local_drafts = NSKeyedUnarchiver.unarchiveObject(withFile: Task.ArchiveURL.path) as? [Task] { 
     drafts = local_drafts 
    } 
    else{ 
     drafts = [] 
    } 
    //Reloading the database 
    ref.observe(.value, with: { snapshot in 
     var newItems: [Task] = [] 
     self.num_of_tasks = Int(snapshot.childrenCount) 
     for item in snapshot.children { 
      //let local = item as! DataSnapshot 
      //let snapshotValue = local.value as! [String: AnyObject] 
      //print(snapshotValue["main_content"] as! String!) 
      let taskItem = Task(snapshot: item as! DataSnapshot) 
      newItems.append(taskItem!) 
     } 
     let merged = drafts + newItems 
     self.items = merged 
     self.tableView.reloadData() 
     completionHandler(true) 
    }) 
} 
+0

我見過幾篇關於completionHandler的文章,但是當我使用它時,它說「未定義的標識符」。這是一個內置的類嗎? –

+0

@萬慧喬,不,這個解決方案應該可以工作......你從哪裏得到這個錯誤? –

+0

唯一的錯誤是「使用未解析的標識符completionHandler」。 –

相關問題