ios - 由于预期为 Int 而不是 String,无法从外部 Firebase 服务器中删除 .childRemoved

标签 ios swift firebase firebase-realtime-database

我是 Swift 的新手 - 请怜悯 - 使用我的代码,我无法从外部 Firebase 服务器中删除 .childRemoved,因为预期的是 Int 而不是 String 并且无法弄清楚如何从我的 tableview 中删除一条消息,我'正在从外部 Firebase 中删除

import UIKit
import Firebase

class FCViewController: UIViewController, UINavigationControllerDelegate {

var ref: FIRDatabaseReference!
    var messages: [FIRDataSnapshot]! = []

func configureDatabase() {

ref = FIRDatabase.database().reference()

ref.child("messages").observe(.childRemoved, with: { (snapshot) in

            // MY PROBLEM 1: can not remove this chat with such identifier from the external Firebase server because an Int is expected instead of an String
            self.messages.remove(at: snapshot.key)

            // MY PROBLEM 2: when solving PROBLEM 1, table does not reload from Firebase like this, check on the comments the link for the answer to this:
            // reload table to featch data from Firebase
            self.messagesTable.reloadData()



        }, withCancel: nil)

}

}

快照.key

prints: -KflJWAyY3KSyyN8RA5U

self.messages 打印:

                [Snap (-KflJVkAYLaoEiFPD86N) {
                     name = "user 1";
                     text = fadsfd;
                     timestamp = "2017-03-21 14:42:45 +0000";
                     }, 
                 Snap (-KflJWAyY3KSyyN8RA5U) {
                      name = "user 1";
                      text = adsfasdf;
                      timestamp = "2017-03-21 14:42:45 +0000";
                     }]

谢谢!

最佳答案

var messages: [FIRDataSnapshot]! = []

是一个快照数组,你正试图通过一个字符串删除它(snapshot.key 是一个字符串)

self.messages.remove(at: snapshot.key)

Swift 期望 at: 成为数组中的整数索引。

我建议不要这样做,因为存储在数组中的对象(对象 ID)与删除时引用的对象不同。

使用字典数组或什至例如 MessageClass 对象会更好,这些对象已填充了来自 Firebase 快照的数据,并将键作为其参数之一。

这是一些涵盖所有基础的代码

class MessageClass {
    var key = ""
    var name = ""
}

var messagesArray = [MessageClass]()

func readInAllMessages() {
    let messagesRef = ref.child("messages")
    messagesRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let snap = child as! FIRDataSnapshot
            let msg = self.snapToMsgClass(child: snap)
            self.messagesArray.append(msg)
        }
    })
}

func addRemoveObserver() {
    let messagesRef = ref.child("messages")
    messagesRef.observe(.childRemoved, with: { snapshot in
        let keyToRemove = snapshot.key 

        if let i = self.messagesArray.index(where: { $0.key == keyToRemove }) {
            self.messagesArray.remove(at: i)
        }
    })
}

func snapToMsgClass(child: FIRDataSnapshot) -> MessageClass {
    let dict = child.value as! [String:Any]
    let name = dict["name"] as! String
    let msg = MessageClass()
    msg.name = name
    msg.key = child.key
    return msg
}

关于ios - 由于预期为 Int 而不是 String,无法从外部 Firebase 服务器中删除 .childRemoved,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42932250/

相关文章:

ios - NSPredicate 根据本地化字符串条目过滤数组

swift - firebase 对象应该是 swift 中的单例吗?

ios - Firebase signInWithCredential 使用 Facebook SDK 给出错误

ios - 单元测试电子邮件 注册 Firebase

android - iphone 和 android 的 Css 区别?

IOS - Google Admob - 错误域=com.google.ads 代码=1 "Request Error: No ad to show."

ios - Swift Combine-多线程上的Publishers.CombineLatest

swift - 如何在 UINavigationController 中禁用边缘滑动的过渡动画?

java - Firebase 删除子 onButtonClick

ios - 如何从命令行重置 iOS 模拟器?