Slide 1

Slide 1 text

yohei SUGIGAMI Realm Centered Design RxSwift+RxRealm w/ RealmNotification Sep. 29, 2016 @ SanSan Realm meetup #19

Slide 2

Slide 2 text

Yohei SUGIGAMI ID susieyy TwitterˍGithub & Qiita

Slide 3

Slide 3 text

γΰτͰίίϩΦυϧ Launch iPhone3G iOS Developer since mid 2008

Slide 4

Slide 4 text

γΰτͰίίϩΦυϧ WWDC 2014 Swift Developer since Day1

Slide 5

Slide 5 text

γΰτͰίίϩΦυϧ Working in a Wantedly

Slide 6

Slide 6 text

Our issues in iOS development

Slide 7

Slide 7 text

Our issues in iOS development Complex

Slide 8

Slide 8 text

Our issues in iOS development State and data management Complex

Slide 9

Slide 9 text

Our issues in iOS development Asynchronous processing Complex

Slide 10

Slide 10 text

Our issues in iOS development Massive delegate pattern Complex https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html Apple MVC Apple MVC

Slide 11

Slide 11 text

Reactive program paradigm Observable Asynchronous data streams Functional program paradigm No side effects function Immutable structure Higher-order functions Lambda expression, monads Asynchronous friendly Unidirectional Data Flow Single source of truth The approach avoids complicated to simplify Redux RxSwift Reactive Cocoa simplify

Slide 12

Slide 12 text

Hoping between RxSwift and ReSwift Redux Rx ??? w/ MVVM (RxSwift) (ReSwift) Unidirectional 
 Data Flow

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Approaching based on Rx with Realm Redux Rx Realm + w/ MVVM (RxSwift) (ReSwift) Unidirectional 
 Data Flow Unidirectional 
 Data Flow (RxRealm)

Slide 19

Slide 19 text

Realm Centered Design View ViewModel Model Rx ( Local state ) Store ( App state ) Rx w/ MVVM

Slide 20

Slide 20 text

Unidirectional Data Flow Transaction ( atomic ) Notification Subscribe Realm Centered Design https://realm.io/news/unidirectional-data-flow-in-swift/

Slide 21

Slide 21 text

Launch iPhone3G iOS Developer since mid 2008 Key technologies Realm Notification RxRealm RxSwift w/ MVVM

Slide 22

Slide 22 text

Launch iPhone3G iOS Developer since mid 2008 Realm Notification Notifications section https://realm.io/docs/swift/latest/#notifications Collection Notifications, since ver 0.98 https://realm.io/news/realm-objc-swift-0.98.0/ Fine-grained change notifications, since ver 0.99 https://realm.io/news/realm-objc-swift-0.99.0/

Slide 23

Slide 23 text

Launch iPhone3G iOS Developer since mid 2008 Do you know the Realm Notification?

Slide 24

Slide 24 text

Launch iPhone3G iOS Developer since mid 2008 You can be notified whenever a Realm, Results, List or LinkingObjects is updated by calling the addNotificationBlock method. a.k.a. Observe What Realm Notification

Slide 25

Slide 25 text

Launch iPhone3G iOS Developer since mid 2008 Realm Notifications Collection Notifications Fine-grained change Points

Slide 26

Slide 26 text

Launch iPhone3G iOS Developer since mid 2008 Realm instances send out notifications to other instances on other threads every time a write transaction is committed: Realm Notifications

Slide 27

Slide 27 text

Launch iPhone3G iOS Developer since mid 2008 Realm Notifications, e.g.

Slide 28

Slide 28 text

Launch iPhone3G iOS Developer since mid 2008 Collection Notifications Notified of updates to query results or to specific objects.

Slide 29

Slide 29 text

Launch iPhone3G iOS Developer since mid 2008 ( should keep a strong reference ) Collection Notifications, e.g.

Slide 30

Slide 30 text

Launch iPhone3G iOS Developer since mid 2008 Fine-grained level changing This change parameter describes including the indices of objects that have been inserted, deleted, or modified since the last notification.

Slide 31

Slide 31 text

Launch iPhone3G iOS Developer since mid 2008 notified indices with deltas Fine-grained change, e.g.

Slide 32

Slide 32 text

Launch iPhone3G iOS Developer since mid 2008 In the case of Core Data let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: #selector(managedObjectContextDidChange:), name: NSManagedObjectContextObjectsDidChangeNotification,
 object: privateManagedObjectContext) Can not observe with filtering.

Slide 33

Slide 33 text

Launch iPhone3G iOS Developer since mid 2008 In the case of Core Data func managedObjectContextObjectsDidChange(notification: NSNotification) { guard let userInfo = notification.userInfo else { return } if let inserts = userInfo[NSInsertedObjectsKey] as? Set where inserts.count > 0 { } if let updates = userInfo[NSUpdatedObjectsKey] as? Set where updates.count > 0 { } if let deletes = userInfo[NSDeletedObjectsKey] as? Set where deletes.count > 0 { } } Received changed objects, instead of changed indices

Slide 34

Slide 34 text

Launch iPhone3G iOS Developer since mid 2008 Notified timing When notifications can’t be delivered instantly, multiple write transactions may be coalesced into a single notification. t Tx COMMIT Tx COMMIT Tx COMMIT Tx COMMIT Tx COMMIT t Notice Notice Write Notification

Slide 35

Slide 35 text

Launch iPhone3G iOS Developer since mid 2008 It is also notified being monitored relation destination of the change of the Object. Observable relations ( linking objects )

Slide 36

Slide 36 text

Launch iPhone3G iOS Developer since mid 2008 Observable relations ( linking objects ) UserObject name avatar_url registered deleted_at profile ProfileObject company position working_histories academy_records emails EmailObject email Observe Change Change Notified

Slide 37

Slide 37 text

Launch iPhone3G iOS Developer since mid 2008 Model View B View A Notification Notification WriteTx Absolutely separation logic and views Singleton PreFetch BackgroundFetch

Slide 38

Slide 38 text

Launch iPhone3G iOS Developer since mid 2008 View A View B Notification WriteTx Absolutely separation logic and views

Slide 39

Slide 39 text

e.g. WriteTx Notification Notification ➜ ➜

Slide 40

Slide 40 text

Launch iPhone3G iOS Developer since mid 2008 RxSwift RxRealm x meets https://github.com/RxSwiftCommunity/RxRealm

Slide 41

Slide 41 text

Launch iPhone3G iOS Developer since mid 2008 What RxRealm Rx wrapper for Realm's collection types.

Slide 42

Slide 42 text

Launch iPhone3G iOS Developer since mid 2008 Observing collections Adds to Results, List, LinkingObjects and AnyRealmCollection these methods: - asObservable() - asObservableArray() - asObservableChangeset() - asObservableArrayChangeset() returning an Observable, RealmChangeset?>

Slide 43

Slide 43 text

Launch iPhone3G iOS Developer since mid 2008 try! Realm().objects(ContactRealm) .asObservableChangeset() .subscribeNext { [weak self] results, changeset in guard let tableView = self?.tableView else { return } self?.results = results if let changeset = changeset { tableView.beginUpdates() tableView.insertRowsAtIndexPaths(…, withRowAnimation: .Automatic) tableView.deleteRowsAtIndexPaths(…, withRowAnimation: .Automatic) tableView.reloadRowsAtIndexPaths(…, withRowAnimation: .Automatic) tableView.endUpdates() } else { tableView.reloadData() } }.addDisposableTo(disposeBag) e.g.

Slide 44

Slide 44 text

- rx_add() - rx_delete() Write transactions // Simple Create [MessageRealm("hello"), MessageRealm("world")] .toObservable() .subscribe(Realm.rx_add()) // With API let request = API.Endpoint.MessagesRequest().request() Session.rx_response(request) .subscribe(Realm.rx_add())

Slide 45

Slide 45 text

B Launch iPhone3G iOS Developer since mid 2008 RxSwift MVVM Realm Centered Design RxRealm

Slide 46

Slide 46 text

Launch iPhone3G iOS Developer since mid 2008 View ViewModel View A Subscribe Holding - The state of a screen-specific (Requesting, etc) - The main data of a screen RxSwift w/ MVVM It is difficult to handle the screen cross-data. View B View C

Slide 47

Slide 47 text

Launch iPhone3G iOS Developer since mid 2008 View ViewModel Subscribe Singleton RxSwift w/ MVVM and Singleton Global ViewModel View A View B View C Holding - The state of a screen-specific (Requesting, etc) - The main data of a screen (Rx Variable) The state of cross over screens

Slide 48

Slide 48 text

Launch iPhone3G iOS Developer since mid 2008 View ViewModel Observable Store Subscribe The state of a screen-specific Singleton RxSwift+RxRealm w/ MVVM (RxRealm) View A View B View C (Rx Variable) The main data of screens The state of cross over screens

Slide 49

Slide 49 text

Conclusion Simple ( is not easy ) Complex

Slide 50

Slide 50 text

5IBOLZPV