concurrency. multithreading

39
[slidesMobiusSignal initially:^{ // Hello Mobius =))) }]; /* * @author Igor Vasilenko. iOS developer at YOTA. * ReactiveCocoa. То, о чем все молчали. */ spbvasilenko i_vasilenko

Upload: phamkhuong

Post on 14-Feb-2017

263 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: concurrency. multithreading

[slidesMobiusSignal initially:^{ // Hello Mobius =)))}];

/* * @author Igor Vasilenko. iOS developer at YOTA. * ReactiveCocoa. То, о чем все молчали. */

spbvasilenkoi_vasilenko

Page 2: concurrency. multithreading

CONCURRENCY. MULTITHREADING.

1

Page 3: concurrency. multithreading

ЗАБАВНО, КОГДА ТВОЙ РАЗУМ ПЫТАЕТСЯ ОСМЫСЛИТЬ ХАОС…

Чак Паланик

CONCURRENCY. MULTITHREADING. 2

Page 4: concurrency. multithreading

practice

3

Page 5: concurrency. multithreading

CONCURRENCY. MULTITHREADING. 5

BAD PRACTICE ON IPHONE 6

Page 6: concurrency. multithreading

CONCURRENCY. MULTITHREADING. 4

WTF?!

[[self.client api_cities] subscribeNext:^(id x) { dispatch_async(dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // Do something dispatch_async(dispatch_get_main_queue(), ^{ // Do something }); }); }];

Page 7: concurrency. multithreading

CONCURRENCY. MULTITHREADING. 6

Page 8: concurrency. multithreading

practice

7

Page 9: concurrency. multithreading

CONCURRENCY. MULTITHREADING. 8

• RACImmediateScheduler

• RACQueueScheduler

Классы RACScheduler:

Главный инструмент для работы с диспетчеризацией в ReactiveCocoa

Предназначен для контроля того, где и когда нужно выполнить ту или иную работу

ABOUT SCHEDULER

Page 10: concurrency. multithreading

CONCURRENCY. MULTITHREADING.

+ (RACScheduler *)mainThreadScheduler;

+ (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority;

Будет выполнять работу не в главном потоке с указанным приоритетом

Будет выполнять работу в главном потоке

9

INITIALIZATION SCHEDULER

Page 11: concurrency. multithreading

+ (RACScheduler *)scheduler;

+ (RACScheduler *)currentScheduler;

Будет выполнять работу не в главном потоке с дефолтным приоритетом

Текущий RACScheduler

10

INITIALIZATION SCHEDULER

CONCURRENCY. MULTITHREADING.

Page 12: concurrency. multithreading

- (RACDisposable *)schedule:(void (^)(void))block;

- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block;

Выполняет блок с указанным NSDate

Выполняет ваш блок

11

PERFORM SCHEDULER

CONCURRENCY. MULTITHREADING.

Page 13: concurrency. multithreading

- (RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block;

Выполняет блок с указанной задержкой

PERFORM SCHEDULER

CONCURRENCY. MULTITHREADING. 12

Page 14: concurrency. multithreading

- (RACSignal *)deliverOn:(RACScheduler *)scheduler;

- (RACSignal *)subscribeOn:(RACScheduler *)scheduler;

Определяет в каком потоке будет выполняться код в блоке при создании подписки

Определяет в каком потоке будет выполняться код блока subscribeNext and etc

SUBSCRIBE AND DELIVER

CONCURRENCY. MULTITHREADING. 13

Page 15: concurrency. multithreading

CONCURRENCY. MULTITHREADING. 14

Page 16: concurrency. multithreading

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {// block executes on other thread with default priority for (NSInteger i = 0; i < 5000; i++) { NSLog(@"LOL"); if (i == 5000) { [subscriber sendNext:@(YES)]; } } return nil; }];

[[[signal subscribeOn:[RACScheduler scheduler]] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) { // block executes on main thread}];

CONCURRENCY. MULTITHREADING. 15

Page 17: concurrency. multithreading

▸ http://spbvasilenko.github.io/ios/2016/01/30/ReactiveCocoa-Concurrency-Multithreading.html

▸ http://rcdp.io/RACScheduler.html

▸ https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/DesignGuidelines.md

GOOD-READS

CONCURRENCY. MULTITHREADING. 16

Page 18: concurrency. multithreading

REACTIVE COCOA 4 TRANSITION

17

Page 19: concurrency. multithreading

REACTIVE COCOA 4

SIGNAL PRODUCERSIGNAL

HOT AND COLD

18

Page 20: concurrency. multithreading

let (signal, sink) = Signal<Int, NoError>.pipe()func buttonTapped(sender: UIButton) { sendNext(sink, random() % 3) } signal.observeNext { (value) -> () in // print received value print(value)}

SIGNAL

REACTIVE COCOA 4 19

Page 21: concurrency. multithreading

func countToValue(value: Int) -> SignalProducer<Int, NoError> { return SignalProducer { (sink, disposable) -> () in for i in 0...value { sendNext(sink, i) } sendCompleted(sink) }}

Инициализация SignalProducer

SIGNAL PRODUCER

REACTIVE COCOA 4 20

Page 22: concurrency. multithreading

let producer = countToValue(5) producer.startWithSignal { (observer, disposable) -> () in observer.observeNext({ (number) -> () in print(number) }) observer.observeCompleted({ () -> () in print("I'm done counting") })}

Подписка

SIGNAL PRODUCER

REACTIVE COCOA 4 21

Page 23: concurrency. multithreading

var bankAccountBalance = MutableProperty<Double>(100)

Value

bankAccountBalance.value = 200;

ProducerbankAccountBalance.producer.startWithSignal { (observer, disposable) -> () in observer.observeNext({ (value) -> () in print(value) }) observer.observeCompleted({ () -> () in print("completed") })}

MUTABLE PROPERTY

REACTIVE COCOA 4 22

Page 24: concurrency. multithreading

[[[signal subscribeOn:[RACScheduler scheduler]] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) { /// Handle }];

WTF?!

STRICT TYPES

REACTIVE COCOA 4 23

Page 25: concurrency. multithreading

var signalA = SignalProducer<String, ReallyBadError> ...

STRICT TYPES

REACTIVE COCOA 4 24

Page 26: concurrency. multithreading

UI BINDING

REACTIVE COCOA 4 25

https://gist.github.com/rpowelll/2fb029ee5f0a9c1e0858

extension UILabel { public var rac_text: MutableProperty<String> { return lazyMutableProperty(self, key: &AssociationKey.text, setter: { self.text = $0 }, getter: { self.text ?? "" })}}

ReactiveCocoa 4 UIKit Extensions

Page 27: concurrency. multithreading

▸ https://spin.atomicobject.com/2015/10/26/reactivecocoa-4-differences/

▸ https://blog.alltheflow.com/reactivecocoa-4-0-with-swift-2-0/

▸ http://blog.brightinventions.pl/reactivecocoa-4-signal-producer/

▸ http://blog.brightinventions.pl/reactivecocoa-4-signal/

▸ http://blog.brightinventions.pl/reactivecocoa-4-mutableproperty/

REACTIVE COCOA 4

GOOD-READS

26

Page 28: concurrency. multithreading

VS.

27

Page 29: concurrency. multithreading

VS.

• RxSwift является относительно недавним дополнением ReactiveX

• Тот факт, что RxSwift является частью ReactiveX, несомненно, будет способствовать его развитию

RXSWIFT INTRODUCING

28

Page 30: concurrency. multithreading

REACTIVE COCOA

RXSWIFT

WHAT SHOULD BE I CHOOSE?

29

Page 31: concurrency. multithreading

VS.

RxSwift не поддерживает разделение горячих и холодных сигналов

+ 1 ReactiveCocoa

HOT AND COLD

30

Page 32: concurrency. multithreading

ЕСЛИ ВЫ ЭТО ПРОИГНОРИРУЕТЕ, ТО ОНО ВЕРНЕТСЯ И ЖЕСТОКО ВАС УКУСИТ. Я ВАС ПРЕДУПРЕДИЛ.

André Staltz Reactive programming expert, JavaScript functional programmer

VS. 31

Page 33: concurrency. multithreading

VS.

В ReactiveCocoa компилятор не позволит вам отправить другую ошибку, только ту, которую вы ожидаете

+ 1 ReactiveCocoa

RxSwift не поддерживает параметризацию ошибок

ERROR HANDLING

32

Observable<T>

Page 34: concurrency. multithreading

VS.

• UIKit binding в RxSwift из под коробки

• UIKit binding в ReactiveCocoa возможен пока лишь только с помощью написания своих Extensions

+ 1 ReactiveCocoa+ 1 RxSwift

UI BINDING

33

Page 35: concurrency. multithreading

VS.

ReactiveCocoa 89 %

RxSwift 11 %

A LITTLE BIT OF STATISTICS

34

Page 36: concurrency. multithreading

VS.

• WhatsApp

• Github

• Yota

• Yandex

• SoundCloud

Кто использует ReactiveCocoa?

A LITTLE BIT OF STATISTICS

35

Page 37: concurrency. multithreading

VS.

• Желаете лучше описать вашу систему. Для вас важно разделение hot/cold сигналов и удобная

параметризация ошибок

• Доверяете только battle tested фреймворкам. Используется в многочисленных больших и

известных проектах

WHY YOU SHOULD USE REACTIVE COCOA INSTEAD OF RXSWIFT?

36

Page 38: concurrency. multithreading

▸ http://artsy.github.io/blog/2015/12/08/reactive-cocoa-to-rxswift/

▸ https://www.raywenderlich.com/126522/reactivecocoa-vs-rxswift

▸ http://stackoverflow.com/questions/32542846/reactivecocoa-vs-rxswift-pros-and-cons

▸ https://github.com/ReactiveX/RxSwift

VS.

GOOD-READS

37

Page 39: concurrency. multithreading

[slidesMobiusSignal finally:^{ // Thank you!}];