Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在CoreData中保存某些内容时,如何更新标签?_Swift_Firebase_Firebase Realtime Database_Core Data - Fatal编程技术网

Swift 在CoreData中保存某些内容时,如何更新标签?

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) { (

我想从Firebase数据库下载数据并将其保存到CoreData中。因为这需要几秒钟,所以我想给用户一个标签,显示保存了多少单词。但在我的应用程序中,它总是启动,但标签没有更新。是否因为保存过程和UI更改都在主线程上

下载以下文字:

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个,例如,我的答案中的代码可以工作,并在加载时更新标签中的“计数”。