Возврату помешали получить документы Пожарная служба Swift - PullRequest
0 голосов
/ 29 марта 2020

Я пытался получить постраничные данные, но по какой-то причине я не смог сделать это правильно. Я делал отладку довольно много раз, но при отсутствии каких-либо ошибок кажется, что это ожидаемое поведение от Firestore getDocuments. Буду признателен за любую помощь -> Я пытаюсь вернуть переменную posts из метода, описанного ниже

private var query: Query
    private var documents: [QueryDocumentSnapshot] = []

    init() {
        let db = Firestore.firestore()
        self.query = db.collection("posts").order(by: "createdTimeStamp")
    }

    func updateQuery() -> Query{
        let nextQuery: Query
        if let lastDocument = documents.last {
            nextQuery = query.start(afterDocument: lastDocument).limit(to: 5)
        } else {
            nextQuery = query.limit(to: 5)
        }
        return nextQuery
    }

    public func fetchNext() -> [ObjectPost] {
        var posts: [ObjectPost] = []
        let updatedQuery = updateQuery()

        updatedQuery.getDocuments(completion: { (querySnapshot, error) in
            if let e = error {
                print(e.localizedDescription)
            }

            guard let snapshot = querySnapshot else {
                print("Error fetching next documents: \(error!)")
                return
            }

            let newPosts = snapshot.documents.map { doc -> ObjectPost in
                let post = try! FirestoreDecoder().decode(ObjectPost.self, from: doc.data())
                print("post \(post.postBody)")
                return post
            }

            posts += newPosts
            print("--After posts update")
            self.documents += snapshot.documents
            print("--After documents update")
        })

        print("Before returning posts")
        return posts
    }

Я могу связаться до «После обновления документов», но он никогда не достигнет «До возвращения сообщений», а также сообщения никогда не возвращаются. Что мне здесь не хватает?

ОБНОВЛЕНИЕ: Для тех, кто читает это как средство для решения своих собственных запросов, мне не хватало асинхронной природы API-интерфейсов Firebase, что очень хорошо объяснено здесь https://medium.com/firebase-developers/why-are-firebase-apis-asynchronous-callbacks-promises-tasks-e037a6654a93 и здесь https://firebase.googleblog.com/2018/07/swift-closures-and-firebase-handling.html

1 Ответ

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

Вам не хватает, что оператор return находится в замыкании, которое выполняется асинхронно после возврата из функции fetchNext.

См. Быстрый запуск Firestore для некоторых примеров управления данными в блоке завершения закрытия.

...