Reactivecocoa: MutableProperties рдкрд░ startWithNext рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд▓рдЭрди рдореЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рд╕рд┐рддре░ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ReactiveCocoa/ReactiveCocoa

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ Disposable s рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рдкрд╛рд╕ viewModel рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде UITableViewCell рдЙрдкрд╡рд░реНрдЧ рд╣реИред didSet рдХреЗ viewModel рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

рдХреЛрдб

private func setupBindings() {

    if let friendViewModel = friendViewModel {
        disposableBindings += friendViewModel.statusLabel.producer.startWithNext({ status in
            self.statusLabel.text = status
        })
    }

}

friendViewModel рдореЗрдВ MutableProperty рдЬрд┐рд╕реЗ statusLabel рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

let statusLabel = MutableProperty<String>("")

рд╡рд╣ disposableBindings рд╕рдВрдкрддреНрддрд┐ рдПрдХ CompositeDisposable , рдЬрд┐рд╕реЗ рдореИрдВ рдУрд╡рд░рд░рд╛рдЗрдб prepareForReuse() рд╡рд┐рдзрд┐ рдореЗрдВ "рдирд┐рдкрдЯрд╛рди" рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреИрд╕реЗ:

override func prepareForReuse() {
    disposableBindings.dispose()
}

рд╕рдорд╕реНрдпрд╛

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж statusLabel рдХреЛ рдХрднреА рднреА рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ prepareForReuse() рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрдм рдореИрдВ logEvents() рдЬреИрд╕реЗ ...producer.logEvents().startWithNext({... рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреИрд╕реЗ:

[] Started fileName: /NotImportant/ButAllTheSame, functionName: setupBindings(), lineNumber: 60
[] Next Tap to invite... fileName: /NotImportant/ButAllTheSame, functionName: setupBindings(), lineNumber: 60
[] Interrupted fileName: /NotImportant/ButAllTheSame, functionName: setupBindings(), lineNumber: 60
[] Terminated fileName: /NotImportant/ButAllTheSame, functionName: setupBindings(), lineNumber: 60
[] Disposed fileName: /NotImportant/ButAllTheSame, functionName: setupBindings(), lineNumber: 60

рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдкрд░ Interrupted рдИрд╡реЗрдВрдЯ рдХреНрдпреЛрдВ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдпрд╣ рдПрдХ MutableProperty , рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдкреНрдЯреЗрдб рдХреЛ рдХреНрдпреЛрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ:

friendViewModel.statusLabel.producer.logEvents().startWithNext({ status in
    self.statusLabel.text = status
})

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ setupBindings() рдкрд┐рдЫрд▓реЗ рдЖрдордВрддреНрд░рдгреЛрдВ рд╕реЗ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╡реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде statusLabel рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ рдЧрд▓рдд рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ statusLabel MutableProperty рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@andersio рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ!

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд░реНрдл FYI рдХрд░реЗрдВ рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рднреА рдорджрдж рдорд┐рд▓реАред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛:

private var disposableBindings = CompositeDisposable()

private func setupBindings() {
        disposableBindings += friendViewModel.statusLabel.producer.startWithNext({ status in
            self.statusLabel.text = status
        })
    }
}

override func prepareForReuse() {
    disposableBindings.dispose()
    disposableBindings = CompositeDisposable()
}

рд╕реЗрд▓ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рддрдХ рд╕рдВрдХреЗрдд рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ CompositeDisposable рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдереАред рдореИрдВ рдЗрд╕реЗ рдПрдирдПрд╕рд╕реАрдПрдЪ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдПрдХ interrupted рдИрд╡реЗрдВрдЯ рднреЗрдЬрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред

рдпрджрд┐ рдЖрдк рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдЙрддреНрдкрд╛рджрдХреЛрдВ (рдЙрддреНрдкрд╛рджрд┐рдд рд╕рдВрдХреЗрдд рдЙрд░реНрдл) рдХрд╛ рдирд┐рдкрдЯрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд┐рдкрдЯрд╛рдП рдЧрдП Disposable рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ CompositeDisposable рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдкрд░ рдПрдХ рдирдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ MutableProperty рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реА рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП flatMap рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

// Assume viewModel is optional.
viewModel.producer.ignoreNil()
    .flatMap(.latest) { $0.statusLabel.producer }

рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдбрд┐рд╕реНрдкреЛрдЬрд▓ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛, рдЬрдмрдХрд┐ рдЬрдм рдЖрдк рд╡реНрдпреВ рдореЙрдбрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓реА рдЬрд╛рддреА рд╣реИред рдЖрдкрдХреЛ рдЗрди рд╕рдорддрд▓ рдЙрддреНрдкрд╛рджрдХреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рдЙрдирдХреЗ рдЧрдВрддрд╡реНрдп рдкрд░ рдмрд╛рдБрдзрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП awakeFromNib ред

рдкреАрдПрд╕ рдЖрдк рд╕реАрдзреЗ рд╕реНрд╡рд┐рдлреНрдЯ 3.0 рдореЗрдВ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдлрд╝реНрд▓реИрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@andersio рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ!

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд░реНрдл FYI рдХрд░реЗрдВ рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рднреА рдорджрдж рдорд┐рд▓реАред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛:

private var disposableBindings = CompositeDisposable()

private func setupBindings() {
        disposableBindings += friendViewModel.statusLabel.producer.startWithNext({ status in
            self.statusLabel.text = status
        })
    }
}

override func prepareForReuse() {
    disposableBindings.dispose()
    disposableBindings = CompositeDisposable()
}

рд╕реЗрд▓ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рддрдХ рд╕рдВрдХреЗрдд рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ CompositeDisposable рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдереАред рдореИрдВ рдЗрд╕реЗ рдПрдирдПрд╕рд╕реАрдПрдЪ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

baei2048 picture baei2048  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BrettThePark picture BrettThePark  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tunidev picture tunidev  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

eimantas picture eimantas  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

samidalouche picture samidalouche  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ