рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ 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
рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗред
рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ?
рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдПрдХ 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 рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдереАред рдореИрдВ рдЗрд╕реЗ рдПрдирдПрд╕рд╕реАрдПрдЪ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@andersio рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ!
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд░реНрдл FYI рдХрд░реЗрдВ рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рднреА рдорджрдж рдорд┐рд▓реАред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛:
рд╕реЗрд▓ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рддрдХ рд╕рдВрдХреЗрдд рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ CompositeDisposable рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдереАред рдореИрдВ рдЗрд╕реЗ рдПрдирдПрд╕рд╕реАрдПрдЪ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!