У меня проблемы с переносом метода getPhotos
с использованием базы данных Firebase Realtime в getPhotos1
с использованием Firestore, но по какой-то причине не удается получить снимок документа в getPhotos1
для объекта Photos1
.
Это мой getPhotos
метод с использованием базы данных Firebase Realtime:
static func getPhotos (completion: @escaping ([Photo]) -> Void) {
//Getting a reference to the database
let dbRef = Database.database().reference()
//Make the db call
dbRef.child("photos").observeSingleEvent(of: .value) { (snapshot) in
//Declare an array to hold the photos
var retrievedPhotos = [Photo]()
//Get the list of snapshots
let snapshots = snapshot.children.allObjects as? [DataSnapshot]
if let snapshots = snapshots {
//Loop through each snapshot and parse out the photos
for snap in snapshots {
//Try to create a photo from a snapshot
let p = Photo(snapshot: snap)
//If successful, then add it to our array
if p != nil {
retrievedPhotos.insert(p!, at: 0)
}
}
}
//After parsing the snapshots, call the completion closure
completion(retrievedPhotos)
}
}
Это его объект
import Foundation
import RealmSwift
import FirebaseDatabase
import Firebase
class Photo: Object {
@objc dynamic var photoId:String?
@objc dynamic var byId:String?
@objc dynamic var byUsername:String?
@objc dynamic var date:String?
@objc dynamic var url:String?
@objc dynamic var postId:String?
override static func primaryKey() -> String? {
return "photoId"
}
override static func indexedProperties() -> [String] {
return ["byUsername"]
}
convenience init?(snapshot:DataSnapshot){
self.init ()
//Photo data
let photoData = snapshot.value as? [String:String]
if let photoData = photoData {
let photoId = snapshot.key
let byId = photoData["byId"]
let byUsername = photoData["byUsername"]
let date = photoData["date"]
let url = photoData["url"]
let postId = photoData["postId"]
guard byId != nil && byUsername != nil && date != nil && url != nil && postId != nil else {
return nil
}
self.photoId = photoId
self.byId = byId
self.byUsername = byUsername
self.date = date
self.url = url
self.postId = postId
}
}
}
Это мой getPhotos1
метод с использованием Firestore, которыйне работает :
static func getPhotos1 (completion: @escaping ([Photo1]) -> Void) {
//Get a Firebase reference
let db = Firestore.firestore()
db.collection("posts").getDocuments() {snapshot, error in
//Declare an array to hold the photos
var retrievedPhotos = [Photo1]()
if error == nil && snapshot != nil {
for document in snapshot!.documents {
let p = Photo1(snapshot: document)
print(p!)
if p != nil {
retrievedPhotos.insert(p!, at: 0)
//print("retrievedPhotos: \(retrievedPhotos)")
}
}
}
//After parsing the snapshots, call the completion closure
completion(retrievedPhotos)
}
}
А это его объект
class Photo1: Object {
@objc dynamic var photoId:String?
@objc dynamic var byId:String?
@objc dynamic var byUsername:String?
@objc dynamic var date:String?
@objc dynamic var url:String?
@objc dynamic var postId:String?
override static func primaryKey() -> String? {
return "photoId"
}
override static func indexedProperties() -> [String] {
return ["byUsername"]
}
convenience init?(snapshot:DocumentSnapshot){
self.init ()
//Photo data
let photoData = snapshot.data() as? [String:String]
if let photoData = photoData {
let photoId = snapshot.documentID
let byId = photoData["byId"]
let byUsername = photoData["byUsername"]
let date = photoData["date"]
let url = photoData["url"]
let postId = photoData["postId"]
guard byId != nil && byUsername != nil && date != nil && url != nil && postId != nil else {
return nil
}
self.photoId = photoId
self.byId = byId
self.byUsername = byUsername
self.date = date
self.url = url
self.postId = postId
}
}
}
Спасибо за совет заранее.
Я пытался найти предыдущую ветку по этому вопросу, и, хотя их было несколько, я не мог понять это, поскольку они не были специфичными для Swift.