@@ -1,4 +1,5 @@  | 
            ||
| 1 | 1 | 
                github "Yalantis/PullToRefresh"  | 
            
| 2 | 
                +github "eggswift/pull-to-refresh"  | 
            |
| 2 | 3 | 
                github "ReactiveX/RxSwift" ~> 5.0  | 
            
| 3 | 4 | 
                github "onevcat/Kingfisher" ~> 5.0  | 
            
| 4 | 5 | 
                github "Alamofire/Alamofire" "5.0.0-beta.1"  | 
            
                @@ -2,5 +2,6 @@ github "Alamofire/Alamofire" "5.0.0-beta.1"  | 
            ||
| 2 | 2 | 
                github "ReactiveX/RxSwift" "5.0.1"  | 
            
| 3 | 3 | 
                github "RxSwiftCommunity/RxDataSources" "4.0.1"  | 
            
| 4 | 4 | 
                github "Yalantis/PullToRefresh" "3.1"  | 
            
| 5 | 
                +github "eggswift/pull-to-refresh" "2.9"  | 
            |
| 5 | 6 | 
                github "onevcat/Kingfisher" "5.5.0"  | 
            
| 6 | 7 | 
                github "tristanhimmelman/ObjectMapper" "3.4.2"  | 
            
                @@ -1557,6 +1557,7 @@  | 
            ||
| 1557 | 1557 | 
                "$(SRCROOT)/Carthage/Build/iOS/PullToRefresh.framework",  | 
            
| 1558 | 1558 | 
                "$(SRCROOT)/Carthage/Build/iOS/Differentiator.framework",  | 
            
| 1559 | 1559 | 
                "$(SRCROOT)/Carthage/Build/iOS/RxRelay.framework",  | 
            
| 1560 | 
                + "$(SRCROOT)/Carthage/Build/iOS/ESPullToRefresh.framework",  | 
            |
| 1560 | 1561 | 
                );  | 
            
| 1561 | 1562 | 
                name = "Run Script";  | 
            
| 1562 | 1563 | 
                outputPaths = (  | 
            
                @@ -1569,6 +1570,7 @@  | 
            ||
| 1569 | 1570 | 
                "$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxCocoa.framework",  | 
            
| 1570 | 1571 | 
                "$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Differentiator.framework",  | 
            
| 1571 | 1572 | 
                "$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxRelay.framework",  | 
            
| 1573 | 
                + "$(DERIVED_FILE_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ESPullToRefresh.framework",  | 
            |
| 1572 | 1574 | 
                );  | 
            
| 1573 | 1575 | 
                runOnlyForDeploymentPostprocessing = 0;  | 
            
| 1574 | 1576 | 
                shellPath = /bin/sh;  | 
            
                @@ -34,6 +34,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
               | 
            ||
| 34 | 34 | 
                registerAppConfiguration()  | 
            
| 35 | 35 | 
                 | 
            
| 36 | 36 | 
                window = UIWindow(frame: UIScreen.main.bounds)  | 
            
| 37 | 
                + window?.backgroundColor = .white  | 
            |
| 37 | 38 | 
                coordinator = AppCoordinator(window: window!)  | 
            
| 38 | 39 | 
                 | 
            
| 39 | 40 | 
                coordinator?.start().subscribe().disposed(by: disposeBag)  | 
            
                @@ -107,7 +107,8 @@ public class GroupViewModel {
               | 
            ||
| 107 | 107 | 
                }  | 
            
| 108 | 108 | 
                 | 
            
| 109 | 109 | 
                     private func setNotification() {
               | 
            
| 110 | 
                -        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
               | 
            |
| 110 | 
                +        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: {
               | 
            |
| 111 | 
                + (notification) in  | 
            |
| 111 | 112 | 
                guard let itemOperator = notification.userInfo?[GroupItemsOperator.key] as? GroupItemsOperator,  | 
            
| 112 | 113 | 
                                 case let .update(_, val) = itemOperator else { return }
               | 
            
| 113 | 114 | 
                self.groupItem.accept(val)  | 
            
                @@ -123,7 +124,8 @@ public class GroupViewModel {
               | 
            ||
| 123 | 124 | 
                 | 
            
| 124 | 125 | 
                }).disposed(by: disposeBag)  | 
            
| 125 | 126 | 
                 | 
            
| 126 | 
                -        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
               | 
            |
| 127 | 
                +        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: {
               | 
            |
| 128 | 
                + (notification) in  | 
            |
| 127 | 129 | 
                guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,  | 
            
| 128 | 130 | 
                case let .update(id, val) = itemOperator,  | 
            
| 129 | 131 | 
                                 let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return }
               | 
            
                @@ -20,7 +20,7 @@ public protocol HomeViewModelDelegate: class {
               | 
            ||
| 20 | 20 | 
                 public class HomeViewModel {
               | 
            
| 21 | 21 | 
                 | 
            
| 22 | 22 | 
                private var page: Int = 1  | 
            
| 23 | 
                - private let disposeBag = DisposeBag()  | 
            |
| 23 | 
                +  | 
            |
| 24 | 24 | 
                 | 
            
| 25 | 25 | 
                private var repository: HomeRepository  | 
            
| 26 | 26 | 
                 | 
            
                @@ -44,19 +44,18 @@ public class HomeViewModel {
               | 
            ||
| 44 | 44 | 
                return [AnimatableSectionModel(model: "photoItem", items: model)]  | 
            
| 45 | 45 | 
                })  | 
            
| 46 | 46 | 
                }  | 
            
| 47 | 
                -  | 
            |
| 47 | 
                +  | 
            |
| 48 | 
                + private let disposeBag = DisposeBag()  | 
            |
| 48 | 49 | 
                public weak var delegate: HomeViewModelDelegate?  | 
            
| 49 | 50 | 
                 | 
            
| 50 | 51 | 
                     public init() {
               | 
            
| 51 | 52 | 
                self.repository = HomeRepository()  | 
            
| 52 | 53 | 
                 | 
            
| 53 | 
                -        scanBtnTapped.subscribe({ [weak self] _ in
               | 
            |
| 54 | 
                -            guard let `self` = self else { return }
               | 
            |
| 54 | 
                +        scanBtnTapped.subscribe({ [unowned self] _ in
               | 
            |
| 55 | 55 | 
                self.delegate?.scanQR()  | 
            
| 56 | 56 | 
                }).disposed(by: disposeBag)  | 
            
| 57 | 57 | 
                 | 
            
| 58 | 
                -        createBtnTapped.subscribe({ [weak self] _ in
               | 
            |
| 59 | 
                -            guard let `self` = self else { return }
               | 
            |
| 58 | 
                +        createBtnTapped.subscribe({ [unowned self] _ in
               | 
            |
| 60 | 59 | 
                self.delegate?.createGroup()  | 
            
| 61 | 60 | 
                }).disposed(by: disposeBag)  | 
            
| 62 | 61 | 
                 | 
            
                @@ -107,9 +106,11 @@ public class HomeViewModel {
               | 
            ||
| 107 | 106 | 
                }  | 
            
| 108 | 107 | 
                 | 
            
| 109 | 108 | 
                     private func setNotification() {
               | 
            
| 110 | 
                -        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
               | 
            |
| 109 | 
                +        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: {
               | 
            |
| 110 | 
                + [unowned self] (notification) in  | 
            |
| 111 | 111 | 
                guard let userInfo = notification.userInfo,  | 
            
| 112 | 
                -            let itemOperator = userInfo[GroupItemsOperator.key] as? GroupItemsOperator else { return }
               | 
            |
| 112 | 
                +                let itemOperator = userInfo["operator"] as? GroupItemsOperator else { return }
               | 
            |
| 113 | 
                +  | 
            |
| 113 | 114 | 
                var items = self._items.value  | 
            
| 114 | 115 | 
                             switch itemOperator {
               | 
            
| 115 | 116 | 
                case let .update(groupId, val):  | 
            
                @@ -130,10 +131,12 @@ public class HomeViewModel {
               | 
            ||
| 130 | 131 | 
                }  | 
            
| 131 | 132 | 
                }).disposed(by: disposeBag)  | 
            
| 132 | 133 | 
                 | 
            
| 133 | 
                -        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
               | 
            |
| 134 | 
                - guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,  | 
            |
| 134 | 
                +        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: {
               | 
            |
| 135 | 
                + [unowned self] (notification) in  | 
            |
| 136 | 
                + guard let itemOperator = notification.userInfo?["operator"] as? PhotoItemsOperator,  | 
            |
| 135 | 137 | 
                case let .update(photoId, val) = itemOperator,  | 
            
| 136 | 
                -                let index = self._items.value.firstIndex(where: { $0.photo_id == photoId }) else { return }
               | 
            |
| 138 | 
                +                let index = self._items.value.firstIndex(where: { $0.photo_id == photoId })
               | 
            |
| 139 | 
                +                else { return }
               | 
            |
| 137 | 140 | 
                var items = self._items.value  | 
            
| 138 | 141 | 
                items[index] = val  | 
            
| 139 | 142 | 
                self._items.accept(items)  | 
            
                @@ -34,20 +34,17 @@ public class MessageViewModel {
               | 
            ||
| 34 | 34 | 
                     public init() {
               | 
            
| 35 | 35 | 
                self.repository = MessageRepository()  | 
            
| 36 | 36 | 
                 | 
            
| 37 | 
                -        sysBtnTapped.asObservable().subscribe {[weak self] (_) in
               | 
            |
| 38 | 
                -            guard let `self` = self else { return }
               | 
            |
| 37 | 
                +        sysBtnTapped.asObservable().subscribe {[unowned self] _ in
               | 
            |
| 39 | 38 | 
                self.readedTip = self.sysReadedTip  | 
            
| 40 | 39 | 
                self.delegate?.didSelect(type: .system)  | 
            
| 41 | 40 | 
                }.disposed(by: disposeBag)  | 
            
| 42 | 41 | 
                 | 
            
| 43 | 
                -        commentBtnTapped.asObservable().subscribe {[weak self] (_) in
               | 
            |
| 44 | 
                -            guard let `self` = self else { return }
               | 
            |
| 42 | 
                +        commentBtnTapped.asObservable().subscribe {[unowned self] _ in
               | 
            |
| 45 | 43 | 
                self.readedTip = self.commentReadedTip  | 
            
| 46 | 44 | 
                self.delegate?.didSelect(type: .comment)  | 
            
| 47 | 45 | 
                }.disposed(by: disposeBag)  | 
            
| 48 | 46 | 
                 | 
            
| 49 | 
                -        thumbupBtnTapped.asObservable().subscribe {[weak self] (_) in
               | 
            |
| 50 | 
                -            guard let `self` = self else { return }
               | 
            |
| 47 | 
                +        thumbupBtnTapped.asObservable().subscribe {[unowned self] _ in
               | 
            |
| 51 | 48 | 
                self.readedTip = self.thumbupReadedTip  | 
            
| 52 | 49 | 
                self.delegate?.didSelect(type: .thumbup)  | 
            
| 53 | 50 | 
                }.disposed(by: disposeBag)  | 
            
                @@ -47,7 +47,6 @@ public final class PhotoDetailItemViewModel {
               | 
            ||
| 47 | 47 | 
                }  | 
            
| 48 | 48 | 
                 | 
            
| 49 | 49 | 
                     private func loadThumbupAndComment() {
               | 
            
| 50 | 
                - print(#function)  | 
            |
| 51 | 50 | 
                         Single.zip(repository.loadComments(), repository.loadThumbups()).subscribe(onSuccess: {[unowned self] (commentItems, thumbupItems) in
               | 
            
| 52 | 51 | 
                self.commentItems.accept(commentItems)  | 
            
| 53 | 52 | 
                self.thumbupItems.accept(thumbupItems)  | 
            
                @@ -127,7 +127,6 @@ public final class PhotoDetailViewModel {
               | 
            ||
| 127 | 127 | 
                }  | 
            
| 128 | 128 | 
                 | 
            
| 129 | 129 | 
                     public func willShow(index: Int) {
               | 
            
| 130 | 
                - print(index)  | 
            |
| 131 | 130 | 
                currIndex = index  | 
            
| 132 | 131 | 
                _hasGetPrice.accept(false)  | 
            
| 133 | 132 | 
                itemViewModel.item.accept(_items.value[index])  | 
            
                @@ -11,10 +11,10 @@ import UIKit  | 
            ||
| 11 | 11 | 
                 public class NavigationController: UINavigationController {
               | 
            
| 12 | 12 | 
                 | 
            
| 13 | 13 | 
                private var operation: Operation = .none  | 
            
| 14 | 
                - private var barConfigures: [UIViewController?: NavigationBarConfiguration] = [:]  | 
            |
| 14 | 
                + private var barConfigures = [UIViewController: NavigationBarConfiguration]()  | 
            |
| 15 | 15 | 
                 | 
            
| 16 | 
                - private var _fromFakeBar = UIToolbar()  | 
            |
| 17 | 
                - private var _toFakeBar = UIToolbar()  | 
            |
| 16 | 
                + private var _fromFakeBar: UIToolbar? = nil  | 
            |
| 17 | 
                + private var _toFakeBar: UIToolbar? = nil  | 
            |
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                     override public init(rootViewController: UIViewController) {
               | 
            
| 20 | 20 | 
                super.init(navigationBarClass: NavigationBar.classForCoder(), toolbarClass: nil)  | 
            
                @@ -73,24 +73,27 @@ fileprivate extension NavigationController {
               | 
            ||
| 73 | 73 | 
                     func setFromFakeNavigationBar(for from: UIViewController) {
               | 
            
| 74 | 74 | 
                         if let navBarFrame = from.getFakeBarFrame(for: navigationBar) {
               | 
            
| 75 | 75 | 
                _fromFakeBar = UIToolbar(configure: barConfigures[from] ?? .default)  | 
            
| 76 | 
                - _fromFakeBar.delegate = self  | 
            |
| 77 | 
                - _fromFakeBar.frame = navBarFrame  | 
            |
| 78 | 
                - from.view.addSubview(_fromFakeBar)  | 
            |
| 76 | 
                + _fromFakeBar?.delegate = self  | 
            |
| 77 | 
                + _fromFakeBar?.frame = navBarFrame  | 
            |
| 78 | 
                + from.view.addSubview(_fromFakeBar!)  | 
            |
| 79 | 79 | 
                }  | 
            
| 80 | 80 | 
                }  | 
            
| 81 | 81 | 
                 | 
            
| 82 | 82 | 
                     func setToFakeNavigationBar(for to: UIViewController) {
               | 
            
| 83 | 83 | 
                         if let navBarFrame = to.getFakeBarFrame(for: navigationBar) {
               | 
            
| 84 | 84 | 
                _toFakeBar = UIToolbar(configure: barConfigures[to] ?? .default)  | 
            
| 85 | 
                - _toFakeBar.delegate = self  | 
            |
| 86 | 
                - _toFakeBar.frame = navBarFrame  | 
            |
| 87 | 
                - to.view.addSubview(_toFakeBar)  | 
            |
| 85 | 
                + _toFakeBar?.delegate = self  | 
            |
| 86 | 
                + _toFakeBar?.frame = navBarFrame  | 
            |
| 87 | 
                + to.view.addSubview(_toFakeBar!)  | 
            |
| 88 | 88 | 
                }  | 
            
| 89 | 89 | 
                }  | 
            
| 90 | 90 | 
                 | 
            
| 91 | 91 | 
                     func clearFake() {
               | 
            
| 92 | 
                - _fromFakeBar.removeFromSuperview()  | 
            |
| 93 | 
                - _toFakeBar.removeFromSuperview()  | 
            |
| 92 | 
                + _fromFakeBar?.removeFromSuperview()  | 
            |
| 93 | 
                + _toFakeBar?.removeFromSuperview()  | 
            |
| 94 | 
                +  | 
            |
| 95 | 
                + _fromFakeBar = nil  | 
            |
| 96 | 
                + _toFakeBar = nil  | 
            |
| 94 | 97 | 
                 | 
            
| 95 | 98 | 
                guard let from = transitionCoordinator?.viewController(forKey: .from),  | 
            
| 96 | 99 | 
                             operation == .pop else { return }
               | 
            
                @@ -130,7 +133,7 @@ extension NavigationController: UINavigationControllerDelegate {
               | 
            ||
| 130 | 133 | 
                vc = context.viewController(forKey: .to)  | 
            
| 131 | 134 | 
                }  | 
            
| 132 | 135 | 
                self.navigationBar.getBarBackground()?.alpha = 1  | 
            
| 133 | 
                - self.navigationBar.apply(for: self.barConfigures[vc] ?? .default)  | 
            |
| 136 | 
                + self.navigationBar.apply(for: self.barConfigures[vc!] ?? .default)  | 
            |
| 134 | 137 | 
                self.clearFake()  | 
            
| 135 | 138 | 
                })  | 
            
| 136 | 139 | 
                }  | 
            
                @@ -23,7 +23,6 @@ public final class AppCoordinator: BaseCoordinator<Void> {
               | 
            ||
| 23 | 23 | 
                     public init(window: UIWindow) {
               | 
            
| 24 | 24 | 
                self.window = window  | 
            
| 25 | 25 | 
                self.containerViewController = ContainerViewController()  | 
            
| 26 | 
                -  | 
            |
| 27 | 26 | 
                super.init(navigationController: NavigationController(rootViewController: containerViewController),  | 
            
| 28 | 27 | 
                viewController: containerViewController)  | 
            
| 29 | 28 | 
                }  | 
            
                @@ -82,6 +82,11 @@ final class GroupViewController: UIViewController {
               | 
            ||
| 82 | 82 | 
                collectionView.startRefreshing(at: .top)  | 
            
| 83 | 83 | 
                }  | 
            
| 84 | 84 | 
                 | 
            
| 85 | 
                +    override func removeFromParent() {
               | 
            |
| 86 | 
                + super.removeFromParent()  | 
            |
| 87 | 
                + print(self)  | 
            |
| 88 | 
                + }  | 
            |
| 89 | 
                +  | 
            |
| 85 | 90 | 
                     deinit {
               | 
            
| 86 | 91 | 
                collectionView.removeAllPullToRefresh()  | 
            
| 87 | 92 | 
                }  | 
            
                @@ -29,7 +29,7 @@ class HomeCoordinator: BaseCoordinator<Void> {
               | 
            ||
| 29 | 29 | 
                @discardableResult  | 
            
| 30 | 30 | 
                     override func start() -> Observable<Void> {
               | 
            
| 31 | 31 | 
                homeViewController.viewModel.delegate = self  | 
            
| 32 | 
                -  | 
            |
| 32 | 
                + deallocatedDispose.dispose()  | 
            |
| 33 | 33 | 
                return Observable.never()  | 
            
| 34 | 34 | 
                }  | 
            
| 35 | 35 | 
                }  | 
            
                @@ -10,7 +10,7 @@ import RxCocoa  | 
            ||
| 10 | 10 | 
                import RxDataSources  | 
            
| 11 | 11 | 
                import PaiaiDataKit  | 
            
| 12 | 12 | 
                import PaiaiUIKit  | 
            
| 13 | 
                -import PullToRefresh  | 
            |
| 13 | 
                +import ESPullToRefresh  | 
            |
| 14 | 14 | 
                 | 
            
| 15 | 15 | 
                 final class HomeViewController: UIViewController {
               | 
            
| 16 | 16 | 
                 | 
            
                @@ -20,22 +20,14 @@ final class HomeViewController: UIViewController {
               | 
            ||
| 20 | 20 | 
                // MARK: data property  | 
            
| 21 | 21 | 
                fileprivate let disposeBag = DisposeBag()  | 
            
| 22 | 22 | 
                 | 
            
| 23 | 
                - internal var viewModel: HomeViewModel!  | 
            |
| 24 | 
                - internal var userInfoViewModel: UserInfoViewModel!  | 
            |
| 23 | 
                + var viewModel: HomeViewModel!  | 
            |
| 24 | 
                + var userInfoViewModel: UserInfoViewModel!  | 
            |
| 25 | 25 | 
                 | 
            
| 26 | 26 | 
                     override func viewDidLoad() {
               | 
            
| 27 | 27 | 
                super.viewDidLoad()  | 
            
| 28 | 28 | 
                initalize()  | 
            
| 29 | 29 | 
                }  | 
            
| 30 | 30 | 
                 | 
            
| 31 | 
                -    override func viewDidAppear(_ animated: Bool) {
               | 
            |
| 32 | 
                - super.viewDidAppear(animated)  | 
            |
| 33 | 
                - }  | 
            |
| 34 | 
                -  | 
            |
| 35 | 
                -    override func viewDidDisappear(_ animated: Bool) {
               | 
            |
| 36 | 
                - super.viewDidDisappear(animated)  | 
            |
| 37 | 
                - }  | 
            |
| 38 | 
                -  | 
            |
| 39 | 31 | 
                     func initalize() {
               | 
            
| 40 | 32 | 
                collectionView.register(UINib(nibName: "PhotoCell",  | 
            
| 41 | 33 | 
                bundle: Bundle(identifier: "com.Paiai-iOS")),  | 
            
                @@ -51,22 +43,22 @@ final class HomeViewController: UIViewController {
               | 
            ||
| 51 | 43 | 
                }  | 
            
| 52 | 44 | 
                 | 
            
| 53 | 45 | 
                     private func setupReloadControl() {
               | 
            
| 54 | 
                -        collectionView.addPullToRefresh(PullToRefresh()) {
               | 
            |
| 46 | 
                +        collectionView.es.addPullToRefresh {
               | 
            |
| 55 | 47 | 
                [unowned self] in  | 
            
| 56 | 48 | 
                self.viewModel.reload()  | 
            
| 57 | 49 | 
                }  | 
            
| 58 | 50 | 
                }  | 
            
| 59 | 51 | 
                 | 
            
| 60 | 52 | 
                     private func setupLoadingControl() {
               | 
            
| 61 | 
                -        collectionView.addPullToRefresh(PullToRefresh(position: .bottom)) {
               | 
            |
| 62 | 
                - [weak self] in  | 
            |
| 63 | 
                -            guard let `self` = self else { return }
               | 
            |
| 53 | 
                +        collectionView.es.addInfiniteScrolling {
               | 
            |
| 54 | 
                + [unowned self] in  | 
            |
| 64 | 55 | 
                self.viewModel.preload()  | 
            
| 65 | 56 | 
                }  | 
            
| 66 | 57 | 
                }  | 
            
| 67 | 58 | 
                 | 
            
| 68 | 59 | 
                     deinit {
               | 
            
| 69 | 
                - collectionView.removeAllPullToRefresh()  | 
            |
| 60 | 
                + collectionView.es.removeRefreshFooter()  | 
            |
| 61 | 
                + collectionView.es.removeRefreshHeader()  | 
            |
| 70 | 62 | 
                }  | 
            
| 71 | 63 | 
                }  | 
            
| 72 | 64 | 
                 | 
            
                @@ -100,11 +92,12 @@ fileprivate extension HomeViewController {
               | 
            ||
| 100 | 92 | 
                     func bindViewModelToRefreshing() {
               | 
            
| 101 | 93 | 
                viewModel.isLoading  | 
            
| 102 | 94 | 
                .asDriver(onErrorJustReturn: true)  | 
            
| 103 | 
                -            .drive(onNext: {[unowned self] flag in
               | 
            |
| 95 | 
                +            .drive(onNext: {[weak self] flag in
               | 
            |
| 96 | 
                +                guard let `self` = self else { return }
               | 
            |
| 104 | 97 | 
                                 if flag {
               | 
            
| 105 | 
                - self.collectionView.endRefreshing(at: .top)  | 
            |
| 98 | 
                + self.collectionView.es.stopPullToRefresh()  | 
            |
| 106 | 99 | 
                                 } else {
               | 
            
| 107 | 
                - self.collectionView.endRefreshing(at: .bottom)  | 
            |
| 100 | 
                + self.collectionView.es.stopLoadingMore()  | 
            |
| 108 | 101 | 
                }  | 
            
| 109 | 102 | 
                }).disposed(by: disposeBag)  | 
            
| 110 | 103 | 
                }  | 
            
                @@ -114,12 +107,11 @@ fileprivate extension HomeViewController {
               | 
            ||
| 114 | 107 | 
                }  | 
            
| 115 | 108 | 
                 | 
            
| 116 | 109 | 
                     func bindUserInfoViewModelToView() {
               | 
            
| 117 | 
                - userInfoViewModel.isLoggedIn  | 
            |
| 118 | 
                - .asDriver(onErrorJustReturn: ())  | 
            |
| 119 | 
                -            .drive(onNext: {[unowned self] _ in
               | 
            |
| 120 | 
                - self.viewModel.clear()  | 
            |
| 121 | 
                - self.collectionView.startRefreshing(at: .top)  | 
            |
| 122 | 
                - }).disposed(by: disposeBag)  | 
            |
| 110 | 
                +        userInfoViewModel.isLoggedIn.subscribe({[weak self] _ in
               | 
            |
| 111 | 
                +            guard let `self` = self else { return }
               | 
            |
| 112 | 
                + self.viewModel.clear()  | 
            |
| 113 | 
                + self.collectionView.startRefreshing(at: .top)  | 
            |
| 114 | 
                + }).disposed(by: disposeBag)  | 
            |
| 123 | 115 | 
                }  | 
            
| 124 | 116 | 
                 | 
            
| 125 | 117 | 
                     func bindViewModelToCollectionView() {
               | 
            
                @@ -22,6 +22,7 @@ class MessageCoordinator: BaseCoordinator<Void> {
               | 
            ||
| 22 | 22 | 
                 | 
            
| 23 | 23 | 
                     override func start() -> Observable<Void> {
               | 
            
| 24 | 24 | 
                messageViewController.viewModel.delegate = self  | 
            
| 25 | 
                + deallocatedDispose.dispose()  | 
            |
| 25 | 26 | 
                return Observable.never()  | 
            
| 26 | 27 | 
                }  | 
            
| 27 | 28 | 
                }  | 
            
                @@ -7,8 +7,8 @@  | 
            ||
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import UIKit  | 
            
| 10 | 
                -import PaiaiDataKit  | 
            |
| 11 | 10 | 
                import PaiaiUIKit  | 
            
| 11 | 
                +  | 
            |
| 12 | 12 | 
                import RxSwift  | 
            
| 13 | 13 | 
                 | 
            
| 14 | 14 | 
                 final class MineAboutViewController: UIViewController {
               | 
            
                @@ -30,6 +30,15 @@ final class MineAboutViewController: UIViewController {
               | 
            ||
| 30 | 30 | 
                versionLabel.text = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String  | 
            
| 31 | 31 | 
                bindGestures()  | 
            
| 32 | 32 | 
                }  | 
            
| 33 | 
                +  | 
            |
| 34 | 
                +    override func viewDidDisappear(_ animated: Bool) {
               | 
            |
| 35 | 
                + super.viewDidDisappear(animated)  | 
            |
| 36 | 
                +  | 
            |
| 37 | 
                + }  | 
            |
| 38 | 
                +  | 
            |
| 39 | 
                +    deinit {
               | 
            |
| 40 | 
                +        print("deinit")
               | 
            |
| 41 | 
                + }  | 
            |
| 33 | 42 | 
                }  | 
            
| 34 | 43 | 
                 | 
            
| 35 | 44 | 
                 fileprivate extension MineAboutViewController {
               | 
            
                @@ -42,7 +51,7 @@ fileprivate extension MineAboutViewController {
               | 
            ||
| 42 | 51 | 
                     func bindGestureToContactUsAction() {
               | 
            
| 43 | 52 | 
                contactUsBtn.rx.tap  | 
            
| 44 | 53 | 
                .asObservable()  | 
            
| 45 | 
                -            .subscribe { (_) in
               | 
            |
| 54 | 
                +            .subscribe { [unowned self] _ in
               | 
            |
| 46 | 55 | 
                let webVC = WebViewController(title: "联系我们",  | 
            
| 47 | 56 | 
                path: "https://pai.ai/page/contact_us")  | 
            
| 48 | 57 | 
                self.navigationController?.pushViewController(webVC)  | 
            
                @@ -52,7 +61,7 @@ fileprivate extension MineAboutViewController {
               | 
            ||
| 52 | 61 | 
                     func bindGestureToScoreAction() {
               | 
            
| 53 | 62 | 
                scoreBtn.rx.tap  | 
            
| 54 | 63 | 
                .asObservable()  | 
            
| 55 | 
                -            .subscribe { (_) in
               | 
            |
| 64 | 
                +            .subscribe {  _ in
               | 
            |
| 56 | 65 | 
                                 guard let url = URL(string: "https://itunes.apple.com/cn/app/pai-aipaiai/id1163960351?mt=8") else {
               | 
            
| 57 | 66 | 
                return  | 
            
| 58 | 67 | 
                }  | 
            
                @@ -63,7 +72,7 @@ fileprivate extension MineAboutViewController {
               | 
            ||
| 63 | 72 | 
                     func bindGestureToUserAgreementAction() {
               | 
            
| 64 | 73 | 
                userAgreementBtn.rx.tap  | 
            
| 65 | 74 | 
                .asObservable()  | 
            
| 66 | 
                -            .subscribe { (_) in
               | 
            |
| 75 | 
                +            .subscribe { [unowned self] _ in
               | 
            |
| 67 | 76 | 
                let webVC = WebViewController(title: "用户协议",  | 
            
| 68 | 77 | 
                path: "https://pai.ai/page/user_agreement")  | 
            
| 69 | 78 | 
                self.navigationController?.pushViewController(webVC)  | 
            
                @@ -78,3 +87,4 @@ extension MineAboutViewController: Storyboarded {
               | 
            ||
| 78 | 87 | 
                return UIStoryboard.mine.instantiateViewController(type: MineAboutViewController.self)  | 
            
| 79 | 88 | 
                }  | 
            
| 80 | 89 | 
                }  | 
            
| 90 | 
                +  | 
            
                @@ -25,8 +25,6 @@ class MineCoordinator: BaseCoordinator<Void> {
               | 
            ||
| 25 | 25 | 
                mineViewController.delegate = self  | 
            
| 26 | 26 | 
                return didCancel  | 
            
| 27 | 27 | 
                }  | 
            
| 28 | 
                -  | 
            |
| 29 | 
                -    override func listenDeallocate() {}
               | 
            |
| 30 | 28 | 
                }  | 
            
| 31 | 29 | 
                 | 
            
| 32 | 30 | 
                 extension MineCoordinator: MineViewControllerDelegate {
               | 
            
                @@ -46,7 +44,7 @@ extension MineCoordinator: MineViewControllerDelegate {
               | 
            ||
| 46 | 44 | 
                 | 
            
| 47 | 45 | 
                     func didSelect(_ item: MineItem) {
               | 
            
| 48 | 46 | 
                mineViewController.dismissController()  | 
            
| 49 | 
                -  | 
            |
| 47 | 
                + deallocatedDispose.dispose()  | 
            |
| 50 | 48 | 
                let vc: UIViewController  | 
            
| 51 | 49 | 
                         switch item {
               | 
            
| 52 | 50 | 
                case .group:  | 
            
                @@ -58,8 +56,8 @@ extension MineCoordinator: MineViewControllerDelegate {
               | 
            ||
| 58 | 56 | 
                case .about:  | 
            
| 59 | 57 | 
                vc = makeMineAboutViewController()  | 
            
| 60 | 58 | 
                }  | 
            
| 61 | 
                -  | 
            |
| 62 | 
                -        vc.rx.deallocated.subscribe(onNext: { _ in
               | 
            |
| 59 | 
                +  | 
            |
| 60 | 
                +        vc.rx.deallocating.subscribe(onNext: { _ in
               | 
            |
| 63 | 61 | 
                self.didCancel.onNext(())  | 
            
| 64 | 62 | 
                }).disposed(by: disposeBag)  | 
            
| 65 | 63 | 
                }  | 
            
                @@ -103,8 +101,8 @@ fileprivate extension MineCoordinator {
               | 
            ||
| 103 | 101 | 
                 | 
            
| 104 | 102 | 
                     func makeMineAboutViewController() -> MineAboutViewController {
               | 
            
| 105 | 103 | 
                let vc = MineAboutViewController.instantiate()  | 
            
| 106 | 
                - navigationController.pushViewController(vc)  | 
            |
| 107 | 
                -  | 
            |
| 104 | 
                + navigationController.pushViewController(vc, animated: true)  | 
            |
| 105 | 
                + print(navigationController)  | 
            |
| 108 | 106 | 
                return vc  | 
            
| 109 | 107 | 
                }  | 
            
| 110 | 108 | 
                 | 
            
                @@ -7,7 +7,7 @@  | 
            ||
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import RxSwift  | 
            
| 10 | 
                -import Foundation  | 
            |
| 10 | 
                +import UIKit  | 
            |
| 11 | 11 | 
                 | 
            
| 12 | 12 | 
                 public class BaseCoordinator<ResultType> {
               | 
            
| 13 | 13 | 
                 | 
            
                @@ -15,6 +15,7 @@ public class BaseCoordinator<ResultType> {
               | 
            ||
| 15 | 15 | 
                 | 
            
| 16 | 16 | 
                let disposeBag = DisposeBag()  | 
            
| 17 | 17 | 
                var didCancel = PublishSubject<Void>()  | 
            
| 18 | 
                + var deallocatedDispose = Disposables.create()  | 
            |
| 18 | 19 | 
                var navigationController: UINavigationController  | 
            
| 19 | 20 | 
                var viewController: UIViewController  | 
            
| 20 | 21 | 
                 | 
            
                @@ -25,7 +26,13 @@ public class BaseCoordinator<ResultType> {
               | 
            ||
| 25 | 26 | 
                     init(navigationController: UINavigationController, viewController: UIViewController) {
               | 
            
| 26 | 27 | 
                self.viewController = viewController  | 
            
| 27 | 28 | 
                self.navigationController = navigationController  | 
            
| 28 | 
                - listenDeallocate()  | 
            |
| 29 | 
                +  | 
            |
| 30 | 
                +        deallocatedDispose = viewController.rx.viewDidDisappear.subscribe(onNext: {[weak self] _ in
               | 
            |
| 31 | 
                +            guard let `self` = self else { return }
               | 
            |
| 32 | 
                +            if !self.navigationController.viewControllers.contains(viewController) {
               | 
            |
| 33 | 
                + self.didCancel.onNext(())  | 
            |
| 34 | 
                + }  | 
            |
| 35 | 
                + })  | 
            |
| 29 | 36 | 
                }  | 
            
| 30 | 37 | 
                 | 
            
| 31 | 38 | 
                     private func store<T>(coordinator: BaseCoordinator<T>) {
               | 
            
                @@ -33,6 +40,7 @@ public class BaseCoordinator<ResultType> {
               | 
            ||
| 33 | 40 | 
                }  | 
            
| 34 | 41 | 
                 | 
            
| 35 | 42 | 
                     private func free<T>(coordinator: BaseCoordinator<T>) {
               | 
            
| 43 | 
                + print(coordinator)  | 
            |
| 36 | 44 | 
                childCoordinators[coordinator.identifier] = nil  | 
            
| 37 | 45 | 
                }  | 
            
| 38 | 46 | 
                 | 
            
                @@ -48,13 +56,4 @@ public class BaseCoordinator<ResultType> {
               | 
            ||
| 48 | 56 | 
                     func start() -> Observable<ResultType> {
               | 
            
| 49 | 57 | 
                         fatalError("Start method should be implemented.")
               | 
            
| 50 | 58 | 
                }  | 
            
| 51 | 
                -  | 
            |
| 52 | 
                -    func listenDeallocate() {
               | 
            |
| 53 | 
                -        navigationController.rx.willShow.subscribe(onNext: {[weak self] (_, _) in
               | 
            |
| 54 | 
                -            guard let `self` = self else { return }
               | 
            |
| 55 | 
                -            if !self.navigationController.viewControllers.contains(self.viewController) {
               | 
            |
| 56 | 
                - self.didCancel.onNext(())  | 
            |
| 57 | 
                - }  | 
            |
| 58 | 
                - }).disposed(by: disposeBag)  | 
            |
| 59 | 
                - }  | 
            |
| 60 | 59 | 
                }  |