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

时间:2016-10-16 23:53:50

标签: ios swift url firebase firebase-realtime-database

我正在使用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 个答案:

答案 0 :(得分:2)

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

您需要做的是将autoID保存到您的消息字典中,以便您可以参考call the message directly。这样你" .child()"你通往所需信息的方式和间接的信息#34;创建一个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)                    
        }            
    })
}

摘要:为了能够直接调用您的邮件而无需查询整个Firebase,并且必须循环访问所需的邮件,您需要知道生成的{{1} },存储该查询并查询具有该ID的引用。

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

这样的事情:

autoID

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

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

let user = User()

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