ios reactive cocoa pipeline
TRANSCRIPT
![Page 1: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/1.jpg)
Рак мозга или мозг рака
Раком можно все
![Page 2: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/2.jpg)
1023
![Page 3: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/3.jpg)
A for Architecture
![Page 4: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/4.jpg)
•Application Layer
•Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
•View Layer
![Page 5: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/5.jpg)
• Application Layer
•Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
•View Layer
Persistence Notifications Runtime
![Page 6: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/6.jpg)
• Application Layer
•Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
•View Layer
NSNotification LocationUpdate
![Page 7: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/7.jpg)
•Application Layer
• Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
•View Layer
Networking Networking policies
![Page 8: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/8.jpg)
•Application Layer
• Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
•View Layer
HTTP.Request HTTP.Response HTTP.Error
![Page 9: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/9.jpg)
•Application Layer
•Transport Layer
• Service Layer
•Model Layer
•ViewModel Layer
•View Layer
API Request Persistence Request Application Service wrapper
![Page 10: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/10.jpg)
•Application Layer
•Transport Layer
• Service Layer
•Model Layer
•ViewModel Layer
•View Layer
Update request Value Object Service Object
![Page 11: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/11.jpg)
•Application Layer
•Transport Layer
•Service Layer
• Model Layer
•ViewModel Layer
•View Layer
Business logic Logic state
![Page 12: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/12.jpg)
•Application Layer
•Transport Layer
•Service Layer
• Model Layer
•ViewModel Layer
•View Layer
Model Object
![Page 13: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/13.jpg)
•Application Layer
•Transport Layer
•Service Layer
•Model Layer
• ViewModel Layer
•View Layer
Application State Presentation Logic
![Page 14: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/14.jpg)
•Application Layer
•Transport Layer
•Service Layer
•Model Layer
• ViewModel Layer
•View Layer
Bindings Presentables
![Page 15: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/15.jpg)
•Application Layer
•Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
• View LayerPresentation UI State
![Page 16: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/16.jpg)
•Application Layer
•Transport Layer
•Service Layer
•Model Layer
•ViewModel Layer
• View LayerPresenters UIObjects Foundation Types
![Page 17: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/17.jpg)
Data Flow
![Page 18: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/18.jpg)
1024
![Page 19: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/19.jpg)
Data + Data Request Flow
![Page 20: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/20.jpg)
Transport Layer
![Page 21: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/21.jpg)
Transport Layer
![Page 22: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/22.jpg)
Transport Layer + Errors
![Page 23: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/23.jpg)
Transport Layer + Binding
![Page 24: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/24.jpg)
And now?
![Page 25: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/25.jpg)
RAC• Signal
• SignalProducer
• Action
• Property
• Result
![Page 26: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/26.jpg)
RAC• Signal
• SignalProducer
• Action
• Property
• Result
• Pipeline
• Future Task
• Future Builder
• Reactive State
• Enum<Value | Error>
![Page 27: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/27.jpg)
RAC• Signal
• SignalProducer
• Action
• Property
• Result
• NSNotificationCenter
• startWithCompletion:
• startWithInput:Completions
• value + KVO
• completions(result, error)
![Page 28: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/28.jpg)
RAC + Transforms• Signal -> Signal - Operator
• Signal.map(transform)
• Signal.retry(3)
• Signal -> Signal -> Signal - pipeline
- retry(map(signal, transform), 3)
✓ signal.map(transform).retry(3)
![Page 29: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/29.jpg)
RAC + (flat)map
![Page 30: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/30.jpg)
Transport Layer + RAC
![Page 31: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/31.jpg)
Transport Layer + RAC
let requestAction = Action<URLRequest, URLResponse, Error> { .../*future task*/ } let http = Action<Request, Response, Error> { request in return Result<Request, Error>(value: request) .flatMap(serialize) //Result<JSON, Error> .flatMap(requestBuilder(forConfiguration: configuration)) //Result<URLRequest, Error> .map(SignalProducer.init) //SignalProducer<URLRequest, Error> .flatMap(.Latest, transform: requestAction.apply) //SignalProducer<URLResponse, Error> .attemptMap(deserialize) //SignalProducer<Response Error }
Заметьте - эта штука вполне может быть общей вне зависимости от входных и выходных данных засчет generic
![Page 32: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/32.jpg)
Build Your Own RAC
extension SignalType { /// Returns a signal that will yield an array of values when `self` completes. @warn_unused_result(message="Did you forget to call `observe` on the signal?") public func collect() -> Signal<[Value], Error> { return self .reduce(CollectState()) { $0.append($1) } .map { $0.values } } }
![Page 33: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/33.jpg)
Transport Layer + RAC
let httpWithPolicy = Action<Request, Response, Error> { request in http.apply(request) .retry(3) .suspendOn(enterBackgroundSignal: background, enterForeground: foreground) }
![Page 34: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/34.jpg)
Service Layer
![Page 35: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/35.jpg)
Service Layer
![Page 36: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/36.jpg)
Service Layer + RAC
let service = Action<Number, Image, Error> { number in let image = cacheService.inquire .apply(number) .concat { xkcdImageHTTP.apply(number) }
let description = xkcdDescriptionHTTP.apply(number)
return combineLatest(image, description).map { ImageWithDescription(image: $0, description: $1) } }
![Page 37: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/37.jpg)
Model Layer
![Page 38: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/38.jpg)
Model Layer
![Page 39: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/39.jpg)
Model Layer + RAC
struct State { let number: Int let value: AnyProperty<ImageWithDescription?>
init(number: Int) { self.number = number self.value = AnyProperty(value: nil, producer: service.apply(number)) } }
let state = MutableProperty(State(number: 100)) let increment = { number.value = State(number: number.value.number + 1) }
let exposedState = AnyProperty(state)
![Page 40: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/40.jpg)
View Model Layer
![Page 41: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/41.jpg)
View Model Layer
![Page 42: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/42.jpg)
VM Layer + RAC let image = model.exposedState .flatMap { $0.value.image } .map { $0 ?? imagePlaceholder }
let description = model.exposedState .flatMap { $0.value.description } .map { $0 ?? "Loading..." }
let rightButtonAction = model.increment
let present = { presenters in presenters.rightButtonAction <~ rightButtonAction presenters.description <~ description.producer presenters.image <~ description.image }
![Page 43: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/43.jpg)
View Layer
![Page 44: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/44.jpg)
View + RAC
class View { //{ self.imageView.image = $0 } let image: Presenter<UIImage> = self.imageView.imagePresenter //{ self.descriptionLabel.value = $0 } let description: Presenter<String> = self.descriptionLabel.textPresenter //{ self.button.clickedSignal.observe($0) } let rightButton: Presenter<() -> ()> = self.button.clickActionPresenter }
![Page 45: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/45.jpg)
Hm…
![Page 46: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/46.jpg)
Benefits?• Consistency
• Observability
• Testability
• Encapsulation
• Completeness
![Page 47: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/47.jpg)
Examples?Popup Action
Navigation Property + Actions
UIKit Sinks + Presentables
Login Form Action + Operators
![Page 48: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/48.jpg)
What’s next?
• RXMarbles (http://rxmarbles.com/)
• Reactive Cocoa sources - all here
![Page 49: iOS Reactive Cocoa Pipeline](https://reader031.vdocuments.mx/reader031/viewer/2022030310/58f04df31a28abb91b8b45d1/html5/thumbnails/49.jpg)
Questions?