// // UIImageView+Kingfisher.swift // SwiftBilibili // // Created by 罗文 on 2021/1/13. // Copyright © 2021年 罗文. All rights reserved. // import Foundation import Kingfisher import RxCocoa import RxSwift typealias ImageOptions = KingfisherOptionsInfo enum ImageResult { case success(UIImage) case failure(Error) var image: UIImage? { if case .success(let image) = self { return image } else { return nil } } var error: Error? { if case .failure(let error) = self { return error } else { return nil } } } extension UIImageView { @discardableResult func setImage( with resource: Resource?, placeholder: UIImage? = nil, options: ImageOptions = [.transition(.fade(0.25))], progress: ((Int64, Int64) -> Void)? = nil, completion: ((ImageResult) -> Void)? = nil ) -> DownloadTask? { var options = options // GIF will only animates in the AnimatedImageView if self is AnimatedImageView == false { options.append(.onlyLoadFirstFrame) } return self.kf.setImage( with: resource, placeholder: placeholder, options: options, progressBlock: progress, completionHandler: { result in switch result { case .success(let value): print("Task done for: \(value.source.url?.absoluteString ?? "")") completion?(.success(value.image)) case .failure(let error): print("Job failed: \(error.localizedDescription)") completion?(.failure(error)) } } ) } } extension Reactive where Base: UIImageView { func image(placeholder: UIImage? = nil, options: ImageOptions = [.transition(.fade(0.25))]) -> Binder { return Binder(self.base) { imageView, resource in imageView.setImage(with: resource, placeholder: placeholder, options: options) } } }