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の終了をリフレッシュさせますか?
私はcompletionHandlerについていくつかの記事を見てきましたが、私が使用するときは "未定義の識別子"と書かれています。これはビルトインクラスですか? –
@WanhuiQiao、そうではありません。このソリューションはうまくいくはずです...どこでエラーが発生しますか? –
唯一のエラーは "未解決の識別子completionHandlerの使用"です。 –