PromiseKit обертывание внешнего закрытия в Promises

Я использую внешнюю библиотеку в Swift, поэтому я не могу контролировать операторы return. Насколько я понимаю, я должен обернуть эти возвраты в обещания, чтобы использовать PromiseKit. Это правильно?

Предполагая, что у меня есть рабочий код следующим образом:

private func getChannelImage(for channel: TCHChannel, completion: @escaping (UIImage?, CAProfileError?) -> Void) {
    if let members = channel.members {
        members.members(completion: { (result, paginator) in
            if result.isSuccessful() {
                // ... do something
            }
            else {
                    completion(nil, CAProfileError.UnknownError)
            }
        })
    }
}

Это может быть трудно читать. Я пытаюсь упростить это с помощью PromiseKit. Во-первых, я хочу упростить members.members(completion: { (result, paginator) в обещании, что я могу позвонить с firstly { ... } синтаксис. Я, таким образом, пытаюсь сделать следующее:

private func asPromise(members: TCHMembers) -> Promise<TCHMemberPaginator> {
    return Promise<TCHMemberPaginator> { fulfill, reject in
        members.members(completion: { (result, paginator) in
            if result.isSuccesful() {
                fulfill(paginator)
            } else {
                reject()
            }
        })
    }
}

Но этот подход не работает, и я получаю "Невозможно определить тип замыкания в текущем контексте". Я пытаюсь найти хороший пример этого варианта использования в Интернете, но у меня возникли проблемы. Есть мысли о том, как правильно вернуть обещания?

1 ответ

Решение

Предполагая, что TCHMemberPaginator а также TCHMembers как показано ниже,

class TCHMemberPaginator {}
class TCHMembers {
    func members(completion: (Bool, TCHMemberPaginator?) -> Void) {}
}

Вот метод возврата Promise,

private func asPromise(members: TCHMembers) -> Promise<TCHMemberPaginator> {
    return Promise { seal in
        members.members(completion: { (result, paginator) in
            if result == true, let p = paginator {
                seal.fulfill(p)
            } else {
                seal.reject(NSError())
            }
        })
    }
}
Другие вопросы по тегам