Reusable.swift 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. //
  2. // Reusable.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2020/11/17.
  6. // Copyright © 2020 Fin. All rights reserved.
  7. //
  8. import RxCocoa
  9. import RxSwift
  10. import UIKit
  11. private var prepareForReuseBag: Int8 = 0
  12. @objc public protocol Reusable: AnyObject {
  13. func prepareForReuse()
  14. }
  15. extension UITableViewCell: Reusable {}
  16. extension UITableViewHeaderFooterView: Reusable {}
  17. extension UICollectionReusableView: Reusable {}
  18. extension Reactive where Base: Reusable {
  19. var reuseBag: DisposeBag {
  20. MainScheduler.ensureExecutingOnScheduler()
  21. if let bag = objc_getAssociatedObject(base, &prepareForReuseBag) as? DisposeBag {
  22. return bag
  23. }
  24. let bag = DisposeBag()
  25. objc_setAssociatedObject(base, &prepareForReuseBag, bag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
  26. _ = sentMessage(#selector(Base.prepareForReuse))
  27. .take(until: deallocated)
  28. .subscribe(onNext: { [weak base] _ in
  29. guard let strongBase = base else {
  30. return
  31. }
  32. let newBag = DisposeBag()
  33. objc_setAssociatedObject(strongBase, &prepareForReuseBag, newBag, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
  34. })
  35. return bag
  36. }
  37. }