【问题标题】:Value of type * has no member 'rx'* 类型的值没有成员 'rx'
【发布时间】:2018-12-03 09:50:29
【问题描述】:

我正在尝试为来自 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()
        }
    }
}

它编译没有问题。但是,当我尝试在 ImageDownloader 实例上调用 rx.download 时,我收到一条错误消息,指出那里没有“rx”扩展名:

你猜为什么会这样?

【问题讨论】:

    标签: ios swift rx-swift reactive rx-cocoa


    【解决方案1】:

    您需要先符合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()
                }
            }
        }
    }
    

    现在你可以像下面这样调用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)
    

    【讨论】:

    • 是的,就是这样。谢谢!
    • 更新:从 Xcode 11.3 开始,Swift 5 的 OP 代码甚至无法编译。
    • 我几乎总是使用已经符合该协议的类型,例如UIViews。起初我完全迷失在这个错误中,但现在一切都说得通了。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2023-04-07
    • 2016-03-11
    • 1970-01-01
    • 2021-06-17
    • 2018-01-15
    • 2017-04-28
    相关资源
    最近更新 更多