
рд╢реБрдн рджрд┐рди, рд╣рдмреНрд░реЛрд╡реНрд╕реНрдХред рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЕрд░реНрдерд╛рддреН рд░реВрдкрд░реЗрдЦрд╛
RxSwift ред рд╣реЗрдмреЗ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ RxSwift рдкрд░ рд▓реЗрдЦ рдереЗ, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЖрдИрдУрдПрд╕ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред
рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХрд░рдХреЗ рджреЗрдЦреЗрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИред
рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкреНрд░рд╕рд╛рд░ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред
рдпрд╣реА рдорд╣рд╛рди рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рд╣рдо рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЛрдб рдореЗрдВ рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХреНрд░рдордмрджреНрдз рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХрдИ рдЕрдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИред рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рдорд╛рд░реА рджреЗрдЦреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ "рд╢реНрд░реЛрддрд╛" рд╣реИред рдпрд╣ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рднреЗрджрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рдЖрд╕рд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрднреА рддрдХ рдХреЛрдИ рдХреАрдбрд╝реЗ рдирд╣реАрдВ ред
рдореИрдВ рдкреЗрдВрдЯ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЪрд▓реЛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдирдореВрджрд╛рд░
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рд▓реЛрдХрди рдпрд╛ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред рдЕрд╡рд▓реЛрдХрдиреАрдп рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рджреЗрдЧрд╛, рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
let observable = Observable<String>.just(" observable")
рдмрд┐рдВрдЧреЛ ! рд╣рдордиреЗ рдкрд╣рд▓рд╛ рдЕрд╡рд▓реЛрдХрдиреАрдп рдмрдирд╛рдпрд╛ред

рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рджреЗрдЦреА рдЧрдИ рд╡рд╕реНрддреБ рдмрдирд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдЧреАред
let observable = Observable<String>.just(" observable") _ = observable.subscribe { (event) in print(event) }
рд╣рдореЗрдВ рд▓реЙрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
next( observable) completed

рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣рдореЗрдВ рдЗрд╕рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ 3 рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдЕрдЧрд▓рд╛
- рддреНрд░реБрдЯрд┐
- рдкреВрд░рд╛
рд╕рд╛рде рдореЗрдВ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рд╡рд╣ рддрддреНрд╡ рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рднреЗрдЬрд╛ рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рд╕рднреА рдИрд╡реЗрдВрдЯ, рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдо рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╣рдорд╛рд░реЗ рдЕрд╡рд▓реЛрдХрдиреАрдп рдиреЗ рд╕рднреА рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рддреЛ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдкреНрд░реЗрдХреНрд╖рдХ рд╕рдм рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╢реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
_ = observable.subscribe(onNext: { (event) in print(event) }, onError: { (error) in print(error) }, onCompleted: { print("finish") }) { print("disposed")
finish disposed
рдЕрд╡рд▓реЛрдХрди рдореЗрдВ, рдЖрдк рди рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╕реЗ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рди рдХреЗрд╡рд▓ рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ, рд╣рдо рд╡рд╣рд╛рдВ рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
let sequence = Observable<Int>.of(1, 2, 4, 5, 6) _ = sequence.subscribe { (event) in print(event) }
next(1) next(2) ... completed
рдЕрд╡рд▓реЛрдХрдиреАрдп рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
let array = [1, 2, 3] let observable = Observable<Int>.from(array) _ = observable.subscribe { (event) in print(event) }
next(1) next(2) next(3) completed
рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╢рдмреНрджрд╛рд╡рд▓реА, рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХреНрдпрд╛ рд╣реИ?
рдЕрд╡рд▓реЛрдХрдиреАрдп рд╕рднреА рдЖрд░рдПрдХреНрд╕ рдХреА рдиреАрдВрд╡ рд╣реИ, рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдирд┐рдкрдЯрд╛рди
рдЕрдм рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рд╣рдореЗрдВ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдХрд░рдиреЗ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдПрдХ "рдардВрдбрд╛" рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдорд╛рд░рд╛ рдЕрд╡рд▓реЛрдХрди рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЛ рддрдм рддрдХ "рдЙрддреНрд╕рд░реНрдЬрд┐рдд" рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рди рд╣реЛред рдЬрдм рддрдХ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ ( рдкреВрд░реНрдг ) рднреЗрдЬрддрд╛ рд╣реИ рддрдм рддрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реИред рдпрджрд┐ рд╣рдо рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
// тДЦ1 // let array = [1, 2, 3] // observable let observable = Observable<Int>.from(array) // observable let subscription = observable.subscribe { (event) in print(event) } //dispos' subscription.dispose()
рдФрд░ рднреА рд╣реИрдВ рд╕реБрдВрджрд░ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдкред
// "" let bag = DisposeBag() // let array = [1, 2, 3] // observable let observable = Observable<Int>.from(array) // observable _ = observable.subscribe { (event) in print(event) }.disposed(by: bag)
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдкрдиреА рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд░реАрд╕рд╛рдЗрдХреНрд▓рд┐рдВрдЧ рдмреИрдЧ рдпрд╛ рдбрд┐рд╕реНрдкреЛрдЬрдмрдЧ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ред
рдпрд╣ рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ? рдпрджрд┐ рдЖрдк рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдмреИрдЧ рдореЗрдВ рди рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рди рдХрд░реЗрдВ, рдпрд╛, рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд▓рд╛рдПрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛ рдЬрд╛рдПрдЧреАред рдЖрдк рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ RxSwift рдХреЗ рд╕рд╛рде DisposeBag рдХрд╛ рдмрд╣реБрдд рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдСрдкрд░реЗрдЯрд░реНрд╕
рдлрд╝рдВрдХреНрд╢рдирд▓-рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдиреАрдЪреЗ FRP) рдореЗрдВ рдХрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ рдЬреЛ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдПрдХ рд╕рд╛рдЗрдЯ rxmarbles рд╣реИ , рдЗрд╕ рдкрд░ рдЖрдк рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдХрд╛рдо рдФрд░ рдкреНрд░рднрд╛рд╡ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
рдирдХреНрд╢рд╛
рдореИрдк рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрддреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
let bag = DisposeBag() let array = [1, 2, 3] let observable = Observable<Int>.from(array).map { $0 * 2 } _ = observable.subscribe { (e) in print(e) }.disponsed(by: bag)
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
next(2) next(4) next(6) completed
рд╣рдо рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдкрд░рд┐рдгрд╛рдореА рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
let bag = DisposeBag() let observable = Observable<Int>.from(array) // observable let transformObservable = observable.map { $0 * 2 } _ = transformObservable.subscribe { (e) in print(e) }.disposed(by: bag)
$ 0 рдХреНрдпрд╛ рд╣реИ?
$ 0 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рддрддреНрд╡ рдХрд╛ рдирд╛рдо рд╣реИ, рд╣рдо рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдкреВрд░реНрдг рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдХреНрд╕рд░ рд╣рдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
// let transformObservable = observable.map { $0 * 2 } // let transformObservable = observable.map { (element) -> Int in return element * 2 }
рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд╣реИ рдирд╛?
рдлрд╝рд┐рд▓реНрдЯрд░
рдлрд╝рд┐рд▓реНрдЯрд░ рдСрдкрд░реЗрдЯрд░ рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрд╡рд▓реЛрдХрдиреАрдп рджреНрд╡рд╛рд░рд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╕рдордп, рд╣рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
let bag = DisposeBag() let array = [1, 2, 3, 4, 5 , 6, 7] // observable let observable = Observable<Int>.from(array) // filter, observable let filteredObservable = observable.filter { $0 > 2 } // _ = filteredObservable.subscribe { (e) in print(e) }.disposed(by: bag)
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ?
next(3) next(4) next(5) ... completed
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╡рд╣реА рдореВрд▓реНрдп рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдСрдкрд░реЗрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
let bag = DisposeBag() let array = [1, 2, 3, 4, 5 , 6, 7] let observable = Observable<Int>.from(array) let filteredAndMappedObservable = observable .filter { $0 > 2 } .map { $0 * 2 } _ = filteredAndMappedObservable.subscribe { (e) in print(e) }.disposed(by: bag)
рдХрдВрд╕реЛрд▓:
next(6) next(8) next(10) next(12) next(14) completed
рдЕрд▓рдЧ
рдПрдХ рдФрд░ рдЙрддреНрдХреГрд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд╡рд┐рдШрдЯрд┐рдд рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреБрд░рдВрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореБрдбрд╝рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╕рдмрдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
let bag = DisposeBag() let array = [1, 1, 1, 2, 3, 3, 5, 5, 6] let observable = Observable<Int>.from(array) let filteredObservable = observable.distinctUntilChanged() _ = filteredObservable.subscribe { (e) in print(e) }.disposed(by: bag)
рдХрдВрд╕реЛрд▓ рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рдореНрди рдорд┐рд▓рддреЗ рд╣реИрдВ:
next(1) next(2) next(3) next(5) next(6) completed
рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рддреЛ рдпрд╣ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рддрдХ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рддрддреНрд╡ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рддрдм рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, рдпреВрдЖрдИ, рдЕрд░реНрдерд╛рддреН рддрд╛рд▓рд┐рдХрд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рд╣реИ, рддреЛ рдЯреЗрдмрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
TakeLast
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд▓реАрд▓рд╛рд╕реНрдЯ рдСрдкрд░реЗрдЯрд░, рд╣рдо рдЕрдВрдд рд╕реЗ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВред
let bag = DisposeBag() let array = [1, 1, 1, 2, 3, 3, 5, 5, 6] let observable = Observable<Int>.from(array) let takeLastObservable = observable.takeLast(1) _ = takeLastObservable.subscribe { (e) in print(e) }.disposed(by: bag)
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
next(6) completed
рдереНрд░реЙрдЯрд▓ рдФрд░ рдЗрдВрдЯрд░рд╡рд▓
рдлрд┐рд░ рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ 2 рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рджреВрд╕рд░реЗ рдХреА рдорджрдж рд╕реЗ, рдкрд╣рд▓реЗ рдХреЗ рдХрд╛рдо рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдереНрд░реЙрдЯрд▓ рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рд╕рдВрдЪрд░рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдПрдХ рдмреНрд░реЗрдХ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЖрдк рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЦреЛрдЬ рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╛ рддреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдереНрд░реЙрдЯрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ 2 рд╕реЗрдХрдВрдб рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЛрдИ рдЕрдВрддрд░рд╛рд▓ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ? рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджреЗрдЦреЗрдВред
let bag = DisposeBag() //observable 0.5 1 0 let observable = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance) let throttleObservable = observable.throttle(1.0, scheduler: MainScheduler.instance) _ = takeLastObservable.subscribe { (event) in print("throttle \(event)") }.disposed(by: bag)
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣реЛрдЧрд╛:
throttle next(0) throttle next(2) throttle next(4) throttle next(6) ...
рдЕрдВрддрд░рд╛рд▓ рдСрдкрд░реЗрдЯрд░ 1 рд╕реЗ 0 рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдореЗрдВ 0.5 рд╕реЗрдХрдВрдб рдХреЗ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдЬреЛ рдЖрд░рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЯрд╛рдЗрдорд░ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдорд╛рди рд╣рд░ 0.5 рд╕реЗрдХрдВрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 2 рдорд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╛рдзрд╛рд░рдг рдЕрдВрдХрдЧрдгрд┐рдд, рдФрд░ рдереНрд░реЙрдЯрд▓ рдСрдкрд░реЗрдЯрд░ рдПрдХ рд╕реЗрдХрдВрдб рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИред
debounce
рдбреЗрдмреНрдпреВ рдкрд╣рд▓реЗ рдХреЗ рдмрдпрд╛рди рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддрд╛- рдЬреБрд▓рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдереЛрдбрд╝рд╛ рд╣реЛрд╢рд┐рдпрд╛рд░ рд╣реИред рдбреЗрдмрд┐рдЯ рдСрдкрд░реЗрдЯрд░ рд╕рдордп рдХреА рдиреМрд╡реАрдВ рд░рд╛рд╢рд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕рдХреЗ рдЯрд╛рдЗрдорд░ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдВрддрд┐рдо рдорд╛рди рд▓реЗрддрд╛ рд╣реИ, рдпрджрд┐ рд╣рдо рдореВрд▓реНрдп рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдорд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╕ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рджреВрд╕рд░реЗ рдпрд╛ рдЖрдзреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИ), рдФрд░ рдлрд┐рд░ рд╣рдо рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдмрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдорд╛рди рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣рд╕ рдПрдХ рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рд╣рд░ 0.5 рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЯрд╛рдЗрдорд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред
let bag = DisposeBag() let observable = Observable<Int>.interval(1.5, scheduler: MainScheduler.instance) let debounceObservable = observable.debounce(1.0, scheduler: MainScheduler.instance) _ = debounceObservable.subscribe({ (e) in print("debounce \(e)") }).disposed(by: bag)
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдореИрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, RxSwift рдврд╛рдВрдЪреЗ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ, рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдЙрдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП rxmarbles рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред
рд╕рдордпрдмрджреНрдзрдХ
рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдп рдЬрд┐рд╕реЗ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЫреВрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рд╡рд╣ рд╣реИ рдЕрдиреБрд╕реВрдЪрдХред рд╢реЗрдбреНрдпреВрд▓рд░, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдереНрд░реЗрдбреЗрдмрд▓ рдХреЛ рдХреБрдЫ рдереНрд░реЗрдбреНрд╕ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдЕрдкрдиреА рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ 2 рдкреНрд░рдХрд╛рд░ рд╣реИрдВ - [рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВ] () рдФрд░ [рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ] ()ред
SubscribeOn
SubscribeOn рдЙрд╕ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдЕрд╡рд▓реЛрдХрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдм рддрдХ рдЪрд▓реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдХреА рдШрдЯрдирд╛рдПрдБ рд╣реИрдВрдбрд▓рд░ (рдЧреНрд░рд╛рд╣рдХ) рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рдЬрд╛рддреАрдВред
ObserveOn
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдореЗрдВ рд░рд┐рдЬрд▓реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдореЗрди рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдпреВрдЖрдИ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
let observable = Observable<Int>.create { (observer) -> Disposable in print("thread observable -> \(Thread.current)") observer.onNext(1) observer.onNext(2) return Disposables.create() }.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background)) _ = observable .observeOn(MainScheduler.instance) .subscribe({ (e) in print("thread -> \(Thread.current)") print(e) })
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
thread observable -> <NSThread: 0x604000465040>{number = 3, name = (null)} thread -> <NSThread: 0x60000006f6c0>{number = 1, name = main} next(1) thread -> <NSThread: 0x60000006f6c0>{number = 1, name = main} next(2)
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╣рдордиреЗ рдбреЗрдЯрд╛ рдХреЛ рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ:
let rxRequest = URLSession.shared.rx.data(request: URLRequest(url: URL(string: "http://jsonplaceholder.typicode.com/posts/1")!)).subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background)) _ = rxRequest .observeOn(MainScheduler.instance) .subscribe { (event) in print(" \(event)") print("thread \(Thread.current)") }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдиреБрд░реЛрдз рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣реЛрдВрдЧреЗред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдХрд╣рдирд╛ рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реЛрдЧреА рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрд░рдПрдХреНрд╕ рдкрджреНрдзрддрд┐ URLSession рдЕрдЪрд╛рдирдХ рдЖрдХрд░реНрд╖рд┐рдд рд╣реБрдЖ, рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЗрд╕ рдХреЛрдб рдХреЛ рд╢реЗрдбреНрдпреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡реИрд╕реЗ, рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдкрд░ рдирд┐рдореНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реЗрдЧреАред
curl -X GET "http://jsonplaceholder.typicode.com/posts/1" -i -v Success (305ms): Status 200 ** next(292 bytes)** thread -> <NSThread: 0x600000072580>{number = 1, name = main} completed thread -> <NSThread: 0x600000072580>{number = 1, name = main}
рдлрд╛рдЗрдирд▓ рдореЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рдЖрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдЪреЗрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдкреВрд░реНрдг рд╕рдВрджреЗрд╢ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рди рдХрд░реЗрдВред
_ = rxRequest .observeOn(MainScheduler.instance) .subscribe { (event) in if (!event.isCompleted && event.error == nil) { let json = try? JSONSerialization.jsonObject(with: event.element!, options: []) print(json!) } print("data -> \(event)") print("thread -> \(Thread.current)") }
рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдШрдЯрдирд╛ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдмрдВрдж рд╕рдВрджреЗрд╢ рдпрд╛ рдЙрд╕рдореЗрдВ рд╕реЗ рдЖрдИ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЕрд▓рдЧ рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдЗрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
curl -X GET "http://jsonplaceholder.typicode.com/posts/1" -i -v Success (182ms): Status 200 { body = "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"; id = 1; title = "sunt aut facere repellat provident occaecati excepturi optio reprehenderit"; userId = 1; } data -> next(292 bytes) thread -> <NSThread: 0x60400006c6c0>{number = 1, name = main} data -> completed thread -> <NSThread: 0x60400006c6c0>{number = 1, name = main}
рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд :-)
рд╡рд┐рд╖рдп
рд╣рдо рдЧрд░реНрдо рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН "рдардВрдбрд╛" рдпрд╛ "рдирд┐рд╖реНрдХреНрд░рд┐рдп" рдЬреЛ "рдЧрд░реНрдо" рдпрд╛ "рд╕рдХреНрд░рд┐рдп" рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд┐рд╖рдп'рдЖрдореА рдХрд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдиреЗ рдЙрдирдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЕрдкрдирд╛ рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ рдФрд░ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рдерд╛, "рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?", рддреЛ рд╡рд┐рд╖рдп рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред
рд╡рд╣ рдХреИрд╕реЗ рд╣реИ? рдЕрд╡рд▓реЛрдХрдиреАрдп рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреНрд▓рд┐рдирд┐рдХ рдореЗрдВ рдЧрдП, рдмреБрд░рд╛рдИ рджрд╛рджреА рдкрд░ рдЧрдП рд╕реНрд╡рд╛рдЧрдд рд░рд┐рд╕реЗрдкреНрд╢рди рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдФрд░ рдкреВрдЫрд╛ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рджрд╛рдиреЗрджрд╛рд░ рдиреЗ рд╣рдореЗрдВ рдЬрд╡рд╛рдм рджрд┐рдпрд╛, рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджрд╛рдиреЗрджрд╛рд░ рдЦрдбрд╝рд╛ рд╣реИ рдФрд░ рдЕрд╕реНрдкрддрд╛рд▓ рдореЗрдВ рдбреЙрдХреНрдЯрд░реЛрдВ рдХреА рдЕрдиреБрд╕реВрдЪреА рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ рдФрд░ рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдХрд┐рд╕реА рднреА рдбреЙрдХреНрдЯрд░ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рддрд╛ рд╣реИ, рджрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрдХрд╛рд░ рд╣реИ, рд╣рдо рдмрд╕ рдКрдкрд░ рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣ рдХрд╣рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдХреБрдЫ рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд▓реЛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдорд┐рд▓рддрд╛ рд╣реИред
рдЪрд▓реЛ рдПрдХ рд╡рд┐рд╖рдп рдФрд░ 2 рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдПрдВ, рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рдж рдкрд╣рд▓рд╛ рдЕрдзрд┐рдХрд╛рд░ рдмрдирд╛рдПрдВ, рд╡рд┐рд╖рдп рдХреЛ рдореВрд▓реНрдп рднреЗрдЬреЗрдВ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░рд╛ рдмрдирд╛рдПрдВ рдФрд░ рдХреБрдЫ рдФрд░ рдорд╛рди рднреЗрдЬреЗрдВред
let subject = PublishSubject<Int>() subject.subscribe { (event) in print(" \(event)") } subject.onNext(1) _ = subject.subscribe { (event) in print(" \(event)") } subject.onNext(2) subject.onNext(3) subject.onNext(4)
рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦреЗрдВрдЧреЗ? рд╕рд╣реА, рдкрд╣рд▓рд╛ рдкрд╣рд▓рд╛ рдЗрд╡реЗрдВрдЯ рдкрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдирд╣реАрдВред
next(1) next(2) next(2) next(3) next(3) next(4) next(4)
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рд╣реИ?
рд╡рд┐рд╖рдп рдХрдИ рд░реВрдкреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд╡реЗ рд╕рднреА рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рднреЗрдЬрддреЗ рд╣реИрдВред
рдкрдмреНрд▓рд┐рд╢рд╕рдмрдЬреЗрдХреНрдЯ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдкрд╛рд╕ рдЖрдП рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
ReplaySubject - рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕реЗ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ (рдХрд┐рддрдиреЗ рдорд╛рди рдпрд╛рдж рд░рд╣реЗрдВрдЧреЗ) рдмрддрд╛рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо n рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдирдП рдЧреНрд░рд╛рд╣рдХ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред
let subject = ReplaySubject<Int>.create(bufferSize: 3) subject.subscribe { (event) in print(" \(event)") } subject.onNext(1) subject.subscribe { (event) in print(" \(event)") } subject.onNext(2) subject.onNext(3) subject.subscribe { (event) in print(" \(event)") } subject.onNext(4)
рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ
next(1) next(1) next(2) next(2) next(3) next(3) next(1) next(2) next(3) next(4) next(4) next(4)
BehaviorSubject рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдмрдХрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рд╣реИ рдФрд░ рдпрд╣ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕реЗ рднреЗрдЬрддрд╛ рд╣реИред
let subject = BehaviorSubject<Int>(value: 0) subject.subscribe { (event) in print(" \(event)") } subject.onNext(1) subject.subscribe { (event) in print(" \(event)") } subject.onNext(2) subject.onNext(3) subject.subscribe { (event) in print(" \(event)") } subject.onNext(4)
рдХрдВрд╕реЛрд▓
next(0) next(1) next(1) next(2) next(2) next(3) next(3) next(3) next(4) next(4) next(4)
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдПрдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдЖрдк рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рди рд╕рдХреЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрди рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рд╣рдо рдпреВрдЖрдИ рдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде RxSwift рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВрдЧреЗ, UI рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
RxSwift'om рдПрдХрдЬреБрдЯ рдирд╣реАрдВ рд╣реИ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рди рдХреЗрд╡рд▓ RxSwift рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ ReacktiveKit / Bond , ReactiveSwift / ReactiveCocoa ред рд╣реБрдб рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рднреА рдореЗрдВ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЖрдк RxSwift рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╡рд╛рдж рдХрд╛ рдЬреНрдЮрд╛рди рд╢реБрд░реВ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ рдФрд░ рдорд╣рд╛рди Google рдореЗрдВ рдЕрдзрд┐рдХ рдЙрддреНрддрд░ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдмрд╛рдж рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рд░ рдХреЛ рд╕рдордЭреЗрдВ, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ: рдкрд╛рд╡реЗрд▓ рдЧреНрд░реАрдЪрд┐рдХрд┐рди