#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)
}