Проблема с типом возврата при быстром закрытии PromiseKit ios

#ios #swift #closures #promisekit

#iOS #swift #закрытия #promisekit

Вопрос:

Я использую Promise Kit в своем приложении. Я новичок в promise kit. Мне нужно знать, как на самом деле работает это закрытие. Итак, если кто-нибудь может объяснить это на примере, это было бы очень полезно.

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я возвращаю ожидаемое значение, я получаю сообщение об ошибке, в котором указано, что не удается преобразовать возвращаемое выражение типа….

Я думаю, возможно, я неправильно все понял.

Вот как я использую цепочки обещаний.

 Glyph().glyphs(book: self.downloadingBook!._id)
                        .then { glyphs -> Promise<[Glyph]> in
                            self.setProgress(progress: 0.07)
                            return Glyph().saveGlyphs(data: glyphs)
                        }.then { lines -> Promise<[Line]> in
                            self.setProgress(progress: 0.14)
                            return Line().lines(book: self.downloadingBook._id)
                        }.then { lines -> Promise<[Line]> in
                            self.setProgress(progress: 0.21)
                            return Line().saveLines(data: lines)
                        }.then { surahs -> Promise<[SurahGlyph]> in
                            self.setProgress(progress: 0.28)
                            return SurahGlyph().surahs(book: self.downloadingBook._id)
                        }.then { surahs -> Promise<[SurahGlyph]> in
                            self.setProgress(progress: 0.35)
                            return SurahGlyph().saveSurahGlyphs(data: surahs)
                        }.then { surahs -> Promise<[SurahGlyph]> in
                            self.setProgress(progress: 0.42)
                            return Translator().translators()
                        }.then { data -> Promise<[Translator]> in
                            self.setProgress(progress: 0.49)
                            return Translator().saveTranslators(translators: data)
                        }.then { data -> Promise<[Translator]> in
                            self.setProgress(progress: 0.56)
                            return Surah().getSurahs(translatorId: "ar.tazweed")
                        }.then { surahs -> Promise<[Surah]> in
                            self.setProgress(progress: 0.63)
                            return Surah().saveSurahs(surahs: surahs)
                        }.then { surahs -> Promise<[Surah]> in
                            self.setProgress(progress: 0.70)
                            Ayah().ayahs(page: 1)
                        }.then { ayahs -> Promise<[Ayah]> in
                            self.setProgress(progress: 0.77)
                            Ayah().saveAyahs(ayahs: ayahs)
                            return Promise.value(ayahs)
                        }.done { _ in
                            self.setProgress(progress: 1)
                            self.statusLabel.text = "Completed"
                            self.reloadBook()
                        }.catch { error in
                            print(error)
                    }
  

Вот как я возвращаюсь из своих функций:

 func translators() -> Promise<[Translator]> {
        do {
            let realm = try Realm()
            let translatorsInRealm = realm.objects(Translator.self)
            if translatorsInRealm.count != 0 {
                Promise.value(Array(translatorsInRealm))
            } else {
                return Promise<[Translator]> { seal in
                    let handler = RequestHandler()
                    let session = RequestHandler.alamofireManager
                    session.request(API.Quran.translatorsURL, method: .get, parameters: nil,
                                    encoding: URLEncoding.default, headers: nil,
                                    interceptor: handler).validate().response { (response) in
                                        if response.result.isSuccess {
                                            do {
                                                let linesFromServer = try JSONDecoder().decode([Translator].self, from: response.data!)
                                                seal.fulfill(linesFromServer)
                                            } catch {
                                                seal.reject(error)
                                            }
                                        } else {
                                            seal.reject(response.error!)
                                        }
                    }
                }
            }
        } catch {
            print("Unexpected error: (error).")
        }

        return Promise.value([])
    }
  

Ошибки, которые я получаю

Ошибки, которые я получаю

Комментарии:

1. Вам необходимо вернуть правильные типы обещаний. Promise<[Translator]> вместо Promise<[SurahGlyph]> в первой ошибке. Аналогичным образом исправьте другое. Вы также забываете вернуть обещание, где Warning выделено.

2. можете ли вы объяснить, где я ошибаюсь? Я добавил функцию Translator().переводчики(). Как вы можете видеть, я возвращаю обещание<[Переводчик]> и после вызова функции в следующей части я ожидаю данные -> Обещание<[Переводчик]> .. Но он показывает мне ошибку, в которой говорится, что я ожидаю Promise<[SurahGlyph]>

Ответ №1:

В типах значений promise есть несоответствие. Исправленная цепочка будет выглядеть следующим образом,

 Glyph().glyphs(book: self.downloadingBook!._id)
                        .then { glyphs -> Promise<[Glyph]> in
                            self.setProgress(progress: 0.07)
                            return Glyph().saveGlyphs(data: glyphs)
                        }.then { lines -> Promise<[Line]> in
                            self.setProgress(progress: 0.14)
                            return Line().lines(book: self.downloadingBook._id)
                        }.then { lines -> Promise<[Line]> in
                            self.setProgress(progress: 0.21)
                            return Line().saveLines(data: lines)
                        }.then { surahs -> Promise<[SurahGlyph]> in
                            self.setProgress(progress: 0.28)
                            return SurahGlyph().surahs(book: self.downloadingBook._id)
                        }.then { surahs -> Promise<[SurahGlyph]> in
                            self.setProgress(progress: 0.35)
                            return SurahGlyph().saveSurahGlyphs(data: surahs)
                        }.then { surahs -> Promise<[Translator]> in
                            self.setProgress(progress: 0.42)
                            return Translator().translators()
                        }.then { data -> Promise<[Translator]> in
                            self.setProgress(progress: 0.49)
                            return Translator().saveTranslators(translators: data)
                        }.then { data -> Promise<[Surah]> in
                            self.setProgress(progress: 0.56)
                            return Surah().getSurahs(translatorId: "ar.tazweed")
                        }.then { surahs -> Promise<[Surah]> in
                            self.setProgress(progress: 0.63)
                            return Surah().saveSurahs(surahs: surahs)
                        }.then { surahs -> Promise<[Ayah]> in
                            self.setProgress(progress: 0.70)
                            return Ayah().ayahs(page: 1)
                        }.then { ayahs -> Promise<[Ayah]> in
                            self.setProgress(progress: 0.77)
                            Ayah().saveAyahs(ayahs: ayahs)
                            return Promise.value(ayahs)
                        }.done { _ in
                            self.setProgress(progress: 1)
                            self.statusLabel.text = "Completed"
                            self.reloadBook()
                        }.catch { error in
                            print(error)
                    }