Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ReactiveSwift:如何重新绑定(删除旧绑定,添加新绑定)?_Swift_Reactive Swift - Fatal编程技术网

ReactiveSwift:如何重新绑定(删除旧绑定,添加新绑定)?

ReactiveSwift:如何重新绑定(删除旧绑定,添加新绑定)?,swift,reactive-swift,Swift,Reactive Swift,我有一个视图必须能够定期重新绑定到一个新的视图模型:这意味着删除旧的绑定以及连接新的绑定。我有一个可行的解决方案,但它不是线程安全的,我想知道是否有更惯用的方法来实现这一点: var disposeBag = CompositeDisposable() func bind(viewModel: TopicProgressViewModel) { disposeBag.dispose() disposeBag = CompositeDisposable() dispos

我有一个视图必须能够定期重新绑定到一个新的视图模型:这意味着删除旧的绑定以及连接新的绑定。我有一个可行的解决方案,但它不是线程安全的,我想知道是否有更惯用的方法来实现这一点:

var disposeBag = CompositeDisposable()

func bind(viewModel: TopicProgressViewModel) {
    disposeBag.dispose()
    disposeBag = CompositeDisposable()

    disposeBag += self.reactive.isHidden <~ viewModel.isHidden
    disposeBag += height <~ viewModel.height
    disposeBag += label.reactive.text <~ viewModel.label
    disposeBag += progress.reactive.progress <~ viewModel.progressFraction
}
var disposeBag=CompositeDisposable()
func绑定(视图模型:TopicProgressViewModel){
disposeBag.dispose()
disposeBag=CompositeDisposable()

disposeBag+=self.reactive.ishiden您可以尝试使用信号序列化绑定,使用
scan
来保持当前绑定状态。可能类似于:

class TopicProgressView {
    private let bindInput: Observer<TopicProgressViewModel, NoError>
    private let bindSignal: Signal<CompositeDisposable, NoError>

    init() {
        private let (signal, observer) = Signal<TopicProgressViewModel, NoError>.pipe()

        bindInput = observer

        bindSignal = signal
            .scan(CompositeDisposable()) { [unowned self] disposeBag, newViewModel in
                disposeBag.dispose()

                let newDisposeBag = CompositeDisposable()

                newDisposeBag += self.reactive.isHidden <~ newViewModel.isHidden
                newDisposeBag += self.height <~ newViewModel.height
                newDisposeBag += self.label.reactive.text <~ newViewModel.label
                newDisposeBag += self.progress.reactive.progress <~ newViewModel.progressFraction

                return newDisposeBag
            }
    }

    func bind(viewModel: TopicProgressViewModel) {
        bindInput.send(value: viewModel)
    }
}
类主题进度视图{
私有输入:观察者
专用信号机:信号机
init(){
私有let(信号,观察者)=signal.pipe()
bindInput=观察者
信号
.scan(CompositeDisposable()){[unowned self]disposeBag,中的newViewModel
disposeBag.dispose()
设newDisposeBag=CompositeDisposable()

newDisposeBag+=self.reactive.isHidden您可以尝试使用信号序列化绑定,使用
scan
来保持当前绑定状态。可能是这样的:

class TopicProgressView {
    private let bindInput: Observer<TopicProgressViewModel, NoError>
    private let bindSignal: Signal<CompositeDisposable, NoError>

    init() {
        private let (signal, observer) = Signal<TopicProgressViewModel, NoError>.pipe()

        bindInput = observer

        bindSignal = signal
            .scan(CompositeDisposable()) { [unowned self] disposeBag, newViewModel in
                disposeBag.dispose()

                let newDisposeBag = CompositeDisposable()

                newDisposeBag += self.reactive.isHidden <~ newViewModel.isHidden
                newDisposeBag += self.height <~ newViewModel.height
                newDisposeBag += self.label.reactive.text <~ newViewModel.label
                newDisposeBag += self.progress.reactive.progress <~ newViewModel.progressFraction

                return newDisposeBag
            }
    }

    func bind(viewModel: TopicProgressViewModel) {
        bindInput.send(value: viewModel)
    }
}
类主题进度视图{
私有输入:观察者
专用信号机:信号机
init(){
私有let(信号,观察者)=signal.pipe()
bindInput=观察者
信号
.scan(CompositeDisposable()){[unowned self]disposeBag,中的newViewModel
disposeBag.dispose()
设newDisposeBag=CompositeDisposable()

newDisposeBag+=self.reactive.ishiden您应该使用
SerialDisposable

var dispose = SerialDisposable()

func bind(viewModel: TopicProgressViewModel) {
    var disposeBag = CompositeDisposable()
    // serialDisposable will automatic dispose previous inner disposable
    dispose.inner = disposeBag
    disposeBag += self.reactive.isHidden <~ viewModel.isHidden
    disposeBag += height <~ viewModel.height
    disposeBag += label.reactive.text <~ viewModel.label
    disposeBag += progress.reactive.progress <~ viewModel.progressFraction
}
var dispose=SerialDisposable()
func绑定(视图模型:TopicProgressViewModel){
var disposeBag=CompositeDisposable()
//serialDisposable将自动处理以前的内部一次性文件
dispose.inner=disposeBag

disposeBag+=self.reactive.ishiden您应该使用
SerialDisposable

var dispose = SerialDisposable()

func bind(viewModel: TopicProgressViewModel) {
    var disposeBag = CompositeDisposable()
    // serialDisposable will automatic dispose previous inner disposable
    dispose.inner = disposeBag
    disposeBag += self.reactive.isHidden <~ viewModel.isHidden
    disposeBag += height <~ viewModel.height
    disposeBag += label.reactive.text <~ viewModel.label
    disposeBag += progress.reactive.progress <~ viewModel.progressFraction
}
var dispose=SerialDisposable()
func绑定(视图模型:TopicProgressViewModel){
var disposeBag=CompositeDisposable()
//serialDisposable将自动处理以前的内部一次性文件
dispose.inner=disposeBag

disposeBag+=self.reactive.ishiden我必须编辑一点(当前在队列中)以避免[unowned self]在init()中太早,但除此之外,它工作得很好:谢谢!很有意义。在我看来,
scan
是一个被低估的反应运算符。这是一种管理状态的非常好的方法。我必须编辑一点(当前在队列中)在init()中过早地避免[unowned self],但除此之外,它工作得很好:谢谢!很有意义。在我看来,
scan
是一种被低估的反应式操作符。这是一种很好的状态管理方法。我不知道
SerialDisposable
,它看起来像是一个有用的类。我唯一关心的是,似乎新旧绑定将在一段很短的时间内出现gs同时存在。也许将
dispose.inner=disposeBag
移动到
var disposeBag=CompositeDisposable()
的正下方会解决这个问题?我同意我们应该在绑定之前进行处理,很遗憾,现在不让我编辑(队列已满?或者这只是出于礼貌,我没有代表)。但我仍然认为这是一个简单的首选答案。我不知道
SerialDisposable
,它看起来像是一个有用的类。我唯一关心的是,似乎会有一个短暂的时期,新旧绑定同时存在。可能会将
dispose.inner=disposeBag
移动到
var disp>的正下方osebag=CompositeDisposable()
会解决这个问题吗?我同意我们应该在绑定之前处理,遗憾的是,现在不允许我编辑(队列已满?或者可能只是出于礼貌,我没有代表)。不过,由于它的简单性,我还是将此作为首选答案。