2017-07-19 12 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() 
     }) 
    }) 
} 

しかし、時には、すべてのデータがロードされているので、これは良い解決策ではなく、さわやかな、まだそれが奇妙になりれ、継続されます。このような状況を解決する方法はありますか? firebaseからすべてのデータを読み込むまで、refreshControlの終了をリフレッシュさせますか?

答えて

1

下にはこれを行う方法が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

@WanhuiQiao、そうではありません。このソリューションはうまくいくはずです...どこでエラーが発生しますか? –

+0

唯一のエラーは "未解決の識別子completionHandlerの使用"です。 –

関連する問題