如何在闭包中返回single.deferred

时间:2019-05-10 08:44:15

标签: closures rx-swift deferred

我在做什么错?我如何从封闭中获得单身? 我如何从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 :(得分:0)

在这种情况下,您需要使用Single.create

这需要一个带有单个参数的块。您可以调用此参数来传递SingleEvent的函数,即.success(Element)(在您的情况下,ElementString.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() }
    }
}