Swift 在CoreData中保存某些内容时,如何更新标签?
我想从Firebase数据库下载数据并将其保存到CoreData中。因为这需要几秒钟,所以我想给用户一个标签,显示保存了多少单词。但在我的应用程序中,它总是启动,但标签没有更新。是否因为保存过程和UI更改都在主线程上 下载以下文字:Swift 在CoreData中保存某些内容时,如何更新标签?,swift,firebase,firebase-realtime-database,core-data,Swift,Firebase,Firebase Realtime Database,Core Data,我想从Firebase数据库下载数据并将其保存到CoreData中。因为这需要几秒钟,所以我想给用户一个标签,显示保存了多少单词。但在我的应用程序中,它总是启动,但标签没有更新。是否因为保存过程和UI更改都在主线程上 下载以下文字: var entityName = "Words" var level = "Beginner" Database.database().reference().child("Words").child(level).observe(.childAdded) { (
var entityName = "Words"
var level = "Beginner"
Database.database().reference().child("Words").child(level).observe(.childAdded) { (snapshot) in
if let dict = snapshot.value as? [String: Any] {
let word = Word(original: "\(dict["original"]!)", translated: "\(dict["translated"]!)", level: "\(dict["level"]!)", phase: "1", lastQuery: dateFormatter.string(from: date), learned: false)
allWords.append(word)
self.saveWord(entity: entityName, word: word)
}
DispatchQueue.main.async {
self.label.text = "\(allWords.count)"
}
}
保存:
func saveWord(entity: String, word: Word) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let context = appDelegate.persistentContainer.viewContext
let entityName = entity
guard let newEntity = NSEntityDescription.entity(forEntityName: entityName, in: context) else {
return
}
let newWord = NSManagedObject(entity: newEntity, insertInto: context)
let original = word.original
let translated = word.translated
let level = word.level
let phase = "1"
let lastQuery = word.lastQuery
let learned = false
newWord.setValue(original, forKey: "original")
newWord.setValue(translated, forKey: "translated")
newWord.setValue(level, forKey: "level")
newWord.setValue(phase, forKey: "phase")
newWord.setValue(lastQuery, forKey: "lastQuery")
newWord.setValue(learned, forKey: "learned")
do {
try context.save()
print("Saved: \(original)")
} catch {
print(error)
}
}
容易解决。。。将代码更改为此,这样,如果跳过一个子项,就不会不必要地刷新计数。此外,Firebase UI调用在主线程上运行,因此不需要DispatchQueue,实际上只会显示总计数
var entityName = "Words"
var level = "Beginner"
Database.database().reference().child("Words").child(level).observe(.childAdded) { (snapshot) in
if let dict = snapshot.value as? [String: Any] {
let word = Word(original: "\(dict["original"]!)", translated: "\(dict["translated"]!)", level: "\(dict["level"]!)", phase: "1", lastQuery: dateFormatter.string(from: date), learned: false)
allWords.append(word)
self.saveWord(entity: entityName, word: word)
self.label.text = "\(allWords.count)"
}
}
请记住,Firebase的速度非常快。如果你正在读取的节点有几千个子节点,你真的不会在UI中看到计数器递增,它将在不到一秒钟的时间内迭代所有这些子节点,你的UI将显示0。。。然后是总的子计数。注意:这个
DispatchQueue.main.async
对于这个用例是不需要的,因为Firebase闭包中的UI调用是在主线程上运行的。但是有什么方法可以显示这个数字吗?因为我完全掌握了你描述的情况。@max哪个数字?正如我所提到的,即使有几千个文档,它也会如此快速地在它们上面迭代——实际上是在眨眼之间——在UI中尝试显示它的增量是没有意义的,因为它只需要几分之一秒。但是,如果你有远远超过10000个,例如,我的答案中的代码可以工作,并在加载时更新标签中的“计数”。