简体   繁体   English

类型*的值没有成员'rx'

[英]Value of type * has no member 'rx'

I'm trying to make a small reactive wrapper for ImageDownloader from AlamofireImage: 我正在尝试从AlamofireImage为ImageDownloader制作一个小的反应式包装:

import Foundation
import UIKit.UIImage
import AlamofireImage
import RxCocoa
import RxSwift


extension Reactive where Base: ImageDownloader {

    public func download(urlRequest: URLRequest, filter: ImageFilter?) -> Observable<UIImage> {

        return Observable.create { observer in

            self.base.download(urlRequest, filter: filter) { response in

                if let error = response.error {
                    observer.onError(error)
                } else if let image = response.value {
                    observer.onNext(image)
                }
            }
            return Disposables.create()
        }
    }
}

It compiles without a problem. 它编译没有问题。 But when I try to call rx.download on an instance of ImageDownloader I get an error saying that there is no 'rx' extension there: 但是,当我尝试在rx.download实例上调用rx.download时,出现一条错误消息,提示那里没有'rx'扩展名:

类型“ ImageDownloader”的值没有成员“ rx”错误

Any guesses why this is happening? 任何猜测为什么会这样?

You need to conform to ReactiveCompatible protocol first and then you can use 'rx' in your downloadRequest call 您需要先遵守ReactiveCompatible协议,然后才能在downloadRequest调用中使用“ rx”

import AlamofireImage
import RxSwift

extension ImageDownloader: ReactiveCompatible {}

extension Reactive where Base: ImageDownloader {

    public func download(urlRequest: URLRequest, filter: ImageFilter?) -> Observable<UIImage> {

        return Observable.create { observer in
            let requestReceipt = ImageDownloader.default.download(urlRequest, filter: filter) { response in
                if let error = response.error {
                    observer.onError(error)
                } else if let image = response.value {
                    observer.onNext(image)
                    observer.onCompleted()
                }
            }
            return Disposables.create {
               requestReceipt?.request.cancel()
            }
        }
    }
}

now you can call ImageDownloader.default.rx.download(urlRequest:filter:) method like below 现在您可以调用ImageDownloader.default.rx.download(urlRequest:filter:)方法,如下所示

let imageRequest = URLRequest.init(url: URL(string: "https://imageserver.com/image/myimage.png")!)
let imageObservable: Observable<UIImage> = ImageDownloader.default.rx.download(urlRequest: imageRequest, filter: nil)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM