繁体   English   中英

为什么这不会泄漏 memory? Rx反馈

[英]Why does this NOT leak memory? RxFeedback

class ViewModel {
...
func state(with bindings: @escaping (Driver<State>) -> Signal<Event>) -> Driver<State> {
        Driver.system(
            initialState: .initial,
            reduce: State.reduce(state:event:),
            feedback:
                bindings,
                react(request: { $0.startLoading }, effects: { _ in
                  self.fetchFavoriteRepositoriesUseCase.execute()
                        .asObservable()
                        .observe(on: self.scheduler)
                        .map(self.repositoriesToRepositoryViewModelsMapper.map(input:))
                        .map { repositories in .loaded(repositories) }
                        .asSignal { error in
                            .just(.failed(error.localizedDescription))
                        }
            }))
    }
...
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let initialTrigger = BehaviorRelay<Void>(value: ())

        let trigger = Observable.merge(initialTrigger.asObservable(), refreshRelay.asObservable())

        let uiBindings: (Driver<FavoriteRepositoriesViewModel.State>) -> Signal<FavoriteRepositoriesViewModel.Event> = bind(self) { me, state in
            let subscriptions = [
                    state.drive(onNext: { state in
                        switch state {
                        case .initial:
                            print("Initial")
                        case .loading:
                            print("Loading")
                        case .failed:
                            print("Failed")
                        case .loaded:
                            print("Loaded")
                        }
                    })
                ]

            let events: [Signal<FavoriteRepositoriesViewModel.Event>] = [
                trigger.map {
                    .load
                }
                .asSignal(onErrorSignalWith: .empty())
            ]

            return Bindings(subscriptions: subscriptions, events: events)
        }

        viewModel.state(with: uiBindings)
        .drive()
        .disposed(by: disposeBag)
    }
}

我试图理解为什么在这种情况下 RxFeedback 的反应方法不会产生 memory 泄漏。 它的 effects 闭包是它的 arguments 之一,它是一个 @escaping 闭包,我不是在弱化它,而是在其中强烈捕获 self 以调用用例。 我认为它与 RxFeedback 无关,而是我对 ARC 和 memory 管理的了解。

为了测试 ViewController 的释放,我只是从 NavigationController 中弹出它。

我希望能详细解释为什么这段代码没有创建保留周期。 提前致谢!

没有保留周期。 但是,您的视图 controller 持有对您的视图 model 的多个引用(直接和间接)。

因此,例如,您的视图 controller 具有viewModel属性。 它还持有一个 disposeBag,它保留了一个 disposable,它保留了一个 Observable,它在您的视图 model 中保留了闭包,它保留了视图 model。

唯一一次强大的自我捕获是一个问题,即一次性用品是否也被捕获的同一个 object 保留。 在这种情况下,视图 model 是“self”,但视图 controller 是保留一次性(通过其处理袋)的视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM