首页 文章

使用URL(Swift)从Firebase获取数据

提问于
浏览
2

我正在使用firebase后端制作应用程序 . 我有数据存储我想出去 . 是的,有快照选项,但在这种特定情况下,通过URL获取信息会更容易 .

例如,如果我在数据库中有一个用户,并且在该用户下,则有一个名为messages的特定节点,并且在该节点下,有许多消息对象 . 当您在firebase控制台中单击其中一个节点时,您将获得对该框顶部的引用(see picture) .

是否可以从顶部的URL获取信息并将其用作快照来检索数据?我之前已经看过它在早期的firebase文档中已经完成了,这正是我需要的,但它已经过时而且不起作用 .

以下是该文档的链接:https://www.firebase.com/docs/ios/guide/retrieving-data.html

我正在使用Swift3和Xcode 8

// Get a reference to our posts
var ref = Firebase(url:"https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts")

// Attach a closure to read the data at our posts reference
ref.observeEventType(.Value, withBlock: { snapshot in
    println(snapshot.value)
}, withCancelBlock: { error in
    println(error.description)
})

1 回答

  • 2

    如您所见,您的 Link.child() 参数 "user" 的摘要以及用户/消息的ID,因此:

    您需要做的是,将 autoID 保存到您的消息字典中,以便您可以参考和 call the message directly . 这样你“ .child() " your way to the message that you need and "间接”创建 direct link 而不是查询整个Firebase .

    为此,您需要像这样保存消息:

    //for my example I've created a struct: Message
    struct Message {
       var message: String = ""
       var user: String = ""
       var messageID: String = ""
    }
    
    func saveMessages(userID: String, message: Message) { // or your dictionary
    
        // here you set an auto id
        let reference = firebase.child(userID).childByAutoId() 
    
        // here you save the id into your messages dict/model
        message.messageID = reference.key
    
        // here you save the dict/model into your firebase
        reference.setValue(message) { (error, ref) -> Void in
            if error != nil {
                print("\(error)")
            }
        }        
    }
    

    你通过 saveMessages(userID: myUserID, messages: message) 调用该函数

    然后你要么:

    将所有消息加载到结构的数组中:

    // we create and instantiate an Array of Message
    var messages: [Message] = []
    
    func loadAllMessages(userID: String) {
    
        //we query all messages from the certain user
        let usersRef = firebase.child(userID).child("messages")
        usersRef.observeEventType(.Value, withBlock: { snapshot in
    
            if snapshot.exists() {
    
                // since we use observeEventType we need to clear our Array
                // everytime our snapshot exists so we're not downloading
                // single messages multiple times
                self.messages.removeAll()
    
                // I'm always sorting for date
                // even if your dict has no date, it doesnt crash
                let sorted = (snapshot.value!.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "date",ascending: false)])
    
                // now we loop through sorted to get every single message
                for element in sorted {
    
                    let message = element.valueForKey("message")! as? String
                    let name = element.valueForKey("name")! as? String
                    let messageID = element.valueForKey("messageID")! as? String
                    // we're creating a message model 
                    let m = Message(message: message!, name: name!, messageID: messageID!)
                    // and saving it into our array
                    self.messages.append(m)                    
                }
            }            
        })
    }
    

    或者您通过您(需要)已经知道的ID直接呼叫消息 .

    func loadSingleMessages(userID: String, messageID: String) {
    
        // we use the direct "link" to our message
        let usersRef = firebase.child(userID).child(messageID)
        usersRef.observeEventType(.Value, withBlock: { snapshot in
    
            if snapshot.exists() {
    
                let message = snapshot.valueForKey("message")! as? String
                let name = snapshot.valueForKey("name")! as? String
                let messageID = snapshot.valueForKey("messageID")! as? String           
                // create the model         
                let m = Message(message: message!, name: name!, messageID: messageID!)
                // and save it to our Array    
                self.messages.append(m)                    
            }            
        })
    }
    

    Summary :为了能够直接调用您的消息而无需查询整个Firebase并且必须循环到所需的消息,您需要知道生成的 autoID ,存储该消息并查询具有该ID的引用 .

    例如,您可以在Firebase中的用户内部设置一个仅存储messageID的数组 . 然后你可以使用它们来查询你想要的消息 .

    像这样的东西:

    struct User {
       var userID: String = ""
       var name: String = ""
       var email: String = ""
       var profileImageURL = ""
       var messages: [String] = []
    }
    
    let user = User()
    

    在您从Firebase下载并实例化用户模型后,您:

    // for every message in our user.messages we call our function
    for message in user.messages { 
        loadSingleMessages(userID: user.userID, messageID: message)
    }
    

    顺便说一下,messageID对于能够删除或编辑某个消息也很重要 .

相关问题