Как вернуть single.deferred в закрытии - PullRequest
0 голосов
/ 10 мая 2019

Что я делаю не так?Как мне получить сингл от закрытия?Как я могу получить значение от Alamofire.request?

 func loadImageName(url: URL) -> Single<String> {
    let data = try? Data(contentsOf: url)
    guard let query = data else {
        return .error(Error.notFound)
    }

        ...

    return Single.deferred {
        Alamofire.request(request).responseJSON {
            if let error = $0.error {
                return Single<String>.error(error)
            }

            return Single<String>.just(result)
        }
    }
}

1 Ответ

0 голосов
/ 10 мая 2019

В этом случае вам понадобится Single.create.

. Для этого требуется блок с одним аргументом.Этот аргумент является функцией, которую вы можете вызвать, чтобы передать SingleEvent, т.е. либо .success(Element) (где Element равно String в вашем случае), либо .error.

Блок долженвернуть Disposable.Вы можете создать Disposable, который будет выполнять дополнительную работу, когда он будет утилизирован.В контексте сетевых запросов имеет смысл отменить запрос.

func loadImageName(url: URL) -> Single<String> {
    let data = try? Data(contentsOf: url)
    guard let query = data else {
        return .error(Error.notFound)
    }

    // ...

    Single.create { single in
        let request = Alamofire.request(request).responseJSON {
            if let error = $0.error {
                return single(.error(error))
            }

            return single(.success(result))
        }

        return Disposables.create { request.cancel() }
    }
}
...