簡體   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