UIImageView+Kingfisher.swift 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // UIImageView+Kingfisher.swift
  3. // SwiftBilibili
  4. //
  5. // Created by 罗文 on 2021/1/13.
  6. // Copyright © 2021年 罗文. All rights reserved.
  7. //
  8. import Foundation
  9. import Kingfisher
  10. import RxCocoa
  11. import RxSwift
  12. typealias ImageOptions = KingfisherOptionsInfo
  13. enum ImageResult {
  14. case success(UIImage)
  15. case failure(Error)
  16. var image: UIImage? {
  17. if case .success(let image) = self {
  18. return image
  19. } else {
  20. return nil
  21. }
  22. }
  23. var error: Error? {
  24. if case .failure(let error) = self {
  25. return error
  26. } else {
  27. return nil
  28. }
  29. }
  30. }
  31. extension UIImageView {
  32. @discardableResult
  33. func setImage(
  34. with resource: Resource?,
  35. placeholder: UIImage? = nil,
  36. options: ImageOptions = [.transition(.fade(0.25))],
  37. progress: ((Int64, Int64) -> Void)? = nil,
  38. completion: ((ImageResult) -> Void)? = nil
  39. ) -> DownloadTask? {
  40. var options = options
  41. // GIF will only animates in the AnimatedImageView
  42. if self is AnimatedImageView == false {
  43. options.append(.onlyLoadFirstFrame)
  44. }
  45. return self.kf.setImage(
  46. with: resource,
  47. placeholder: placeholder,
  48. options: options,
  49. progressBlock: progress,
  50. completionHandler: { result in
  51. switch result {
  52. case .success(let value):
  53. print("Task done for: \(value.source.url?.absoluteString ?? "")")
  54. completion?(.success(value.image))
  55. case .failure(let error):
  56. print("Job failed: \(error.localizedDescription)")
  57. completion?(.failure(error))
  58. }
  59. }
  60. )
  61. }
  62. }
  63. extension Reactive where Base: UIImageView {
  64. func image(placeholder: UIImage? = nil, options: ImageOptions = [.transition(.fade(0.25))]) -> Binder<Resource?> {
  65. return Binder(self.base) { imageView, resource in
  66. imageView.setImage(with: resource, placeholder: placeholder, options: options)
  67. }
  68. }
  69. }