Значение типа * не имеет члена 'rx' - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь сделать небольшую реактивную оболочку для ImageDownloader от AlamofireImage:

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()
        }
    }
}

Компилируется без проблем.Но когда я пытаюсь вызвать rx.download для экземпляра ImageDownloader, я получаю сообщение об ошибке, в котором говорится, что там нет расширения 'rx':

Value of type 'ImageDownloader' has no member 'rx' error

Есть догадки, почему это происходит?

1 Ответ

0 голосов
/ 03 декабря 2018

Сначала вам нужно соответствовать протоколу ReactiveCompatible, а затем вы можете использовать 'rx' в вызове downloadRequest

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)
...