Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Realm Centered Design

yohei sugigami
September 29, 2016

Realm Centered Design

RxSwift+RxRealm w/ RealmNotification

yohei sugigami

September 29, 2016
Tweet

More Decks by yohei sugigami

Other Decks in Technology

Transcript

  1. 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
  2. Hoping between RxSwift and ReSwift Redux Rx ??? w/ MVVM

    (RxSwift) (ReSwift) Unidirectional 
 Data Flow
  3. Approaching based on Rx with Realm Redux Rx Realm +

    w/ MVVM (RxSwift) (ReSwift) Unidirectional 
 Data Flow Unidirectional 
 Data Flow (RxRealm)
  4. Unidirectional Data Flow Transaction ( atomic ) Notification Subscribe Realm

    Centered Design https://realm.io/news/unidirectional-data-flow-in-swift/
  5. 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/
  6. 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
  7. 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
  8. Launch iPhone3G iOS Developer since mid 2008 Collection Notifications Notified

    of updates to query results or to specific objects.
  9. Launch iPhone3G iOS Developer since mid 2008 ( should keep

    a strong reference ) Collection Notifications, e.g.
  10. 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.
  11. 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.
  12. 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<NSManagedObject> where inserts.count > 0 { } if let updates = userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject> where updates.count > 0 { } if let deletes = userInfo[NSDeletedObjectsKey] as? Set<NSManagedObject> where deletes.count > 0 { } } Received changed objects, instead of changed indices
  13. 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
  14. 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 )
  15. 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
  16. Launch iPhone3G iOS Developer since mid 2008 Model View B

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

    B Notification WriteTx Absolutely separation logic and views
  18. Launch iPhone3G iOS Developer since mid 2008 RxSwift RxRealm x

    meets https://github.com/RxSwiftCommunity/RxRealm
  19. Launch iPhone3G iOS Developer since mid 2008 What RxRealm Rx

    wrapper for Realm's collection types.
  20. 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<Array<T>, RealmChangeset?>
  21. 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.
  22. - 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())
  23. 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
  24. 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
  25. 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