Ios 无法从外部Firebase服务器中删除.childRemoved,因为预期为Int而不是String

Ios 无法从外部Firebase服务器中删除.childRemoved,因为预期为Int而不是String,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我是Swift的新手-请原谅-我的代码无法从外部Firebase服务器中删除.child,因为预期为Int而不是string,并且无法从我的tableview中删除我正在从外部Firebase中删除的消息 import UIKit import Firebase class FCViewController: UIViewController, UINavigationControllerDelegate { var ref: FIRDatabaseReference! var me

我是Swift的新手-请原谅-我的代码无法从外部Firebase服务器中删除.child,因为预期为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)

}

}
snapshot.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";
                     }]

谢谢大家!

我找到了一个完全符合@mitchellmaler所说的答案

可以在这里找到:

他基本上通过
indexOfSnapshotInArray
实现了所有的魔法,并将其转换为索引

如果你不能打败敌人,就加入他们

在这种情况下,索引的。。。这解决了Int问题

多谢各位

var消息:[FIRDataSnapshot]!=[]

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

self.messages.remove(位于:snapshot.key)

Swift期望at是数组中的整数索引

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

您最好使用一组字典,甚至是MessageClass对象,这些对象已使用Firebase快照中的数据填充,其中键是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
}

您将遇到许多问题,但最重要的是,您正在将快照对象存储到阵列中,这就是对象ID(不是键,但对象id将与.remove事件中返回的id不同。您不必解决Int问题-使用它。请参阅我的答案,并查看我对答案中引用的问题的答案。问题2的问题可在此处找到:谢谢@Jay@Jay你能分享一下addRemoveObserver()的使用方法吗有效吗?我不知道如何调用它来从数组中获取已删除的索引。谢谢你指的是。请注意(.childRemoved就像我在回答中使用的一样?如果是这样,它会将被删除的节点传递到您的代码中。从那里您可以获得节点的密钥,并使用该密钥将节点从数组中删除。我的回答中包含完成该任务的代码。@Jay,这是正确的。我很难处理您的建议。将近20个小时的时间试图找出当你有相同的时间时,你能在另一个问题中看一下吗?非常感谢。请注意,在这个答案中,是蛮力在数组中的每个对象上迭代寻找密钥。有更优雅、更高效、更快速的方法。亲爱的@Jay,更优雅、更高效、更快速的方法是mor作为一个更好的回答,我并不欢迎请分享我的爱。谢谢!看到我涵盖整个过程的答案。谢谢Jay,确实是一种更优雅、更高效、更快速的方式…我在加载表视图时遇到了问题,无法将该类放入另一个文件中。这是我的代码:刷新表有什么不对的地方?谢谢!亲爱的@Jay,你是如何删除的在我的VC示例中,当从单独的文件调用时,是否从数组中删除d项?Thanks@Victor你能再发一个问题吗?我想其他人可以从中受益,也可以从我们建议的任何解决方案中受益。另外,如果这个答案有帮助,请接受它!亲爱的@Jay:非常感谢。你可以想象,我也是新来的…:p我想会更好其他人可以在这里看到完整的答案。我现在会这样做,并让您知道评论。:)非常感谢您的时间和编码智慧。问题2的问题可以在这里找到:谢谢!