Я хочу обработать после завершения обработки "getDocuments" в FireStore - PullRequest
0 голосов
/ 15 марта 2020

Firestore имеет коллекцию «пользователей» и «постов». Каждый документ пользователя имеет коллекцию "сообщений". «Posts» имеет тип ссылки «post», а значение «posts / documentID».

Я хочу получить список сообщений пользователя, я пытался реализовать с помощью следующего кода, но «print (self. postsData) "пусто.

Как я могу это сделать?

class postFetcher: ObservableObject {
    @Published var postsData: [PostModel] = []
    private let userDefaults = UserDefaults.standard
    private let uid: String
    private var db: Firestore!
    private let dispatchGroup = DispatchGroup()
    private let dispatchQueue = DispatchQueue(label: "queue")

    init() {
        db = Firestore.firestore()
        uid = self.userDefaults.object(forKey: "userDataUid") as! String
        fetchPostsData()
    }

    func fetchPostsData() {
        self.db.collection("users").document(uid).collection("posts").getDocuments { (snaps, err) in

            guard let snaps = snaps else { return }

            for document in snaps.documents {
                self.dispatchGroup.enter()
                self.dispatchQueue.async(group: self.dispatchGroup) { [weak self] in
                    self?.asyncProcess(document: document) { () -> Void in
                        self?.dispatchGroup.leave()
                    }
                }
            }

            self.dispatchGroup.notify(queue: .main) {
                print(self.postsData)
            }
        }
    }

    func asyncProcess(document: QueryDocumentSnapshot, completion: () -> Void) {
        let refarence: DocumentReference = document.data()["post"] as! DocumentReference

        refarence.getDocument { (snap, err) in

            guard let snap = snap else { return }
            self.postsData.append(PostModel(
                documentId: snap.documentID,
                text: snap.data()!["text"] as! String
            ))
        }
        completion()
    }
}

1 Ответ

1 голос
/ 15 марта 2020

Вы звоните completion() не в том месте. Он должен быть внутри фигурной скобки, которая в данный момент ему предшествует.

Также вы ссылаетесь на self.postsData из разных тем. Плохая идея. Оберните все вызовы для чтения или записи общих данных в какую-то общую очередь отправки. Более того, не делитесь данными вообще! Передайте результаты обратно обработчику завершения.

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