Не удается получить Firestore для преобразования документов снимков в объекты «Фото» - PullRequest
0 голосов
/ 29 сентября 2019

У меня проблемы с переносом метода 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...