Как получить UIImage от AnyPublisher Swift 5 (каркас комбайна) - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь понять, как использовать Многоразовый кэш изображений в Swift с UIImageView. Я пытаюсь просто присвоить фактическое изображение переменной ImageLoader () для UIImageView, чтобы я мог использовать его как UIImage.

Код:

let loader = ImageLoader()

myImage.image = loader.loadImage(from: myUrl)

возможно :

loader.loadImage(from: myUrl)

myImage.image = loader(image)

Но это приводит к невозможности вызова значения нефункционального типа 'ImageLoader' error

Код:

final class ImageLoader {

private let cache = ImageCache()

func loadImage(from url: URL) -> AnyPublisher<UIImage?, Never> {
    if let image = cache[url] {
        return Just(image).eraseToAnyPublisher()
    }
    return URLSession.shared.dataTaskPublisher(for: url)
        .map { UIImage(data: $0.data) }
        .catch { error in return Just(nil) }
        .handleEvents(receiveOutput: {[unowned self] image in
            guard let image = image else { return }
            self.cache[url] = image
        })
        .subscribe(on: DispatchQueue.global(qos: .background))
        .receive(on: RunLoop.main)
        .eraseToAnyPublisher()
}
}

1 Ответ

1 голос
/ 15 февраля 2020

Вы пытаетесь установить результат издателя в ImageView. Вам нужно использовать что-то вроде этого:

 class SomeTestClass {

    let imageView = UIImageView()
    var subscriptions = Set<AnyCancellable>()

    func loadImage() {

        ImageLoader().loadImage(from: URL(string: "someURL")!).sink { (image) in
            self.imageView.image = image
        }.store(in: &subscriptions)

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...