使用 URL (Swift) 从 Firebase 获取数据
Posted
技术标签:
【中文标题】使用 URL (Swift) 从 Firebase 获取数据【英文标题】:Fetching Data from Firebase with URL (Swift) 【发布时间】:2016-10-16 23:53:49 【问题描述】:我正在使用 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】:如您所见,您的Link
是.child()
参数"user"
和用户/消息的ID 的摘要,所以:
您需要做的是,将autoID
保存到您的消息字典中,以便您可以参考它和call the message directly
。这样您就可以“.child()
”获取所需的消息,并“间接”创建一个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 调用 Message。
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 并且必须循环访问所需的消息,您需要知道生成的 autoID
,存储它并使用该 ID 查询引用。
例如,您可以在 Firebase 的用户内部设置一个数组,仅存储消息 ID。然后您可以使用它们来查询您想要的消息。
类似这样的:
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 对于删除或编辑某条消息也很重要。
【讨论】:
非常感谢您的详细回答。我今天会试试这个并报告给你!以上是关于使用 URL (Swift) 从 Firebase 获取数据的主要内容,如果未能解决你的问题,请参考以下文章
可以从 Swift 中的 firebase 在浏览器中看到的图像的 URL
如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?
从 Firebase 读取数据并保存到数组中 (Swift)
Firebase 和 Alamofire Url TableViewCell 图像加载问题 Swift 4