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 中的 React 方法在这种情况下不会造成内存泄漏。它以效果闭包作为其参数之一,这是一个 @escaping 闭包,我并没有削弱它,而是在其中强烈捕获 self 来调用用例。我认为这与 RxFeedback 无关,而是我对 ARC 和内存管理的了解。
为了测试 ViewController 的释放,我只是从 NavigationController 中弹出它。
我希望详细解释为什么这段代码没有创建保留周期。预先感谢!
没有保留周期。但是,您的视图控制器持有对视图模型的多个引用(直接和间接)。
例如,您的视图控制器有一个
viewModel
属性。它还持有一个 disposeBag,它保留了一个一次性的,它保留了一个 Observable,它保留了视图模型中的闭包,它保留了视图模型。
对自我的强烈捕捉唯一会出现问题的情况是一次性物品也被被捕捉的同一个物体所保留。在这种情况下,视图模型是“自身”,但视图控制器是保留一次性内容的模型(通过其处置袋)。