Slide 1

Slide 1 text

3FBMN+BQBO.FFUVQ

Slide 2

Slide 2 text

SFBMN@KQ

Slide 3

Slide 3 text

IUUQTHJUIVCDPNLJTIJLBXBLBUTVNJ LJTIJLBXBLBUTVNJ IUUQLJTIJLBXBLBUTVNJIBUFOBCMPHDPN Realm

Slide 4

Slide 4 text

3FDFOU6QEBUFT

Slide 5

Slide 5 text

3FBMN0CKFDUJWF$4XJGU XBT

Slide 6

Slide 6 text

Realm Objective-C/Swift 0.98.8 ˖ 9DPEF㼎䘔 ˖ غؚؿ؍حؙأ

Slide 7

Slide 7 text

3FBMN0CKFDUJWF$4XJGU✮㹀 ˖ 'JOFHSBJOFE/PUJDBUJPO ˖ "EETVQQPSUGPSMJOLJOHPCKFDUTQSPQFSUJFT

Slide 8

Slide 8 text

-JOLJOHPCKFDUTQSPQFSUJFT class Person: Object { dynamic var name = "" dynamic var age = 0 let dogs = List() } class Dog: Object { dynamic var name = "" var owners: [Person] { return linkingObjects(Person.self, forProperty: "dogs") } }

Slide 9

Slide 9 text

-JOLJOHPCKFDUTQSPQFSUJFT class Person: Object { dynamic var name = "" dynamic var age = 0 let dogs = List() } class Dog: Object { dynamic var name = "" var owners: [Person] { return linkingObjects(Person.self, forProperty: "dogs") } }

Slide 10

Slide 10 text

-JOLJOHPCKFDUTQSPQFSUJFT class Person: Object { dynamic var name = "" dynamic var age = 0 let dogs = List() } class Dog: Object { dynamic var name = "" let owners = LinkingObjects(fromType: Person.self, property: "dogs") }

Slide 11

Slide 11 text

-JOLJOHPCKFDUTQSPQFSUJFT class Person: Object { dynamic var name = "" dynamic var age = 0 let dogs = List() } class Dog: Object { dynamic var name = "" let owners = LinkingObjects(fromType: Person.self, property: "dogs") }

Slide 12

Slide 12 text

-JOLJOHPCKFDUTQSPQFSUJFT ˖ 鎘皾幥׫فٗػذ؍أز،سفٗػذ؍ ˖ ꟼ侧؝ٝذشؙٓأ

Slide 13

Slide 13 text

-JOLJOHPCKFDUTQSPQFSUJFT ˖ ٓ؎ـ،حفر٦ز ˖ ؙؒٔך勴⟝ח⢪ִ׷״ֲח ˖ -JOLJOH0CKFDUTכ3FTVMUTך؟ـؙٓأ MUFS @ זוךًاحسָ⢪ִ׷

Slide 14

Slide 14 text

-JOLJOHPCKFDUTQSPQFSUJFT realm .objects(Dog) .filter("ANY owners.name = '...'")

Slide 15

Slide 15 text

'JOFHSBJOFE/PUJDBUJPO let dogs = realm.objects(Dog) token = dogs.addNotificationBlock { (change: RealmCollectionChange) in switch change { case let .Initial(change): ... case let .Update(change, deletions, insertions, modifications): ... case let .Error(error): ... } }

Slide 16

Slide 16 text

'JOFHSBJOFE/PUJDBUJPO public enum RealmCollectionChange { case Initial(T) case Update(T, deletions: [Int], insertions: [Int], modifications: [Int]) case Error(NSError) }

Slide 17

Slide 17 text

token = dogs.addNotificationBlock { (change: RealmCollectionChange) in switch change { case let .Initial(change): self.tableView.reloadData() case let .Update(change, deletions, insertions, modifications): self.tableView .beginUpdates() self.tableView .deleteRowsAtIndexPaths( deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) self.tableView .insertRowsAtIndexPaths( insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) self.tableView.endUpdates() ...

Slide 18

Slide 18 text

token = dogs.addNotificationBlock { (change: RealmCollectionChange) in switch change { case let .Initial(change): self.tableView.reloadData() case let .Update(change, deletions, insertions, modifications): self.tableView .beginUpdates() self.tableView .deleteRowsAtIndexPaths( deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) self.tableView .insertRowsAtIndexPaths( insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) self.tableView.endUpdates() ...

Slide 19

Slide 19 text

token = dogs.addNotificationBlock { (change: RealmCollectionChange) in switch change { case let .Initial(change): self.tableView.reloadData() case let .Update(change, deletions, insertions, modifications): self.tableView .beginUpdates() self.tableView .deleteRowsAtIndexPaths( deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) self.tableView .insertRowsAtIndexPaths( insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, withRowAnimation: .Automatic) self.tableView.endUpdates() ...

Slide 20

Slide 20 text

favorites = realm .objects(Tweet) .filter("favorited = %@", true) .sorted("createdAt", ascending: false) token = favorites?.addNotificationBlock { [weak self] (change: RealmCollectionChange) in ... self?.tableView.reloadData() } timeline = realm .objects(Tweet) .sorted("createdAt", ascending: false) token = timeline?.addNotificationBlock { [weak self] (change: RealmCollectionChange) in ... self?.tableView.reloadData() } 3FTVMUTח㢌⻉ָ֮׏׋儗׌ֽ鸐濼ׁ׸׷״ֲח

Slide 21

Slide 21 text

favorites = realm .objects(Tweet) .filter("favorited = %@", true) .sorted("createdAt", ascending: false) token = favorites?.addNotificationBlock { [weak self] (change: RealmCollectionChange) in ... self?.tableView.reloadData() } timeline = realm .objects(Tweet) .sorted("createdAt", ascending: false) token = timeline?.addNotificationBlock { [weak self] (change: RealmCollectionChange) in ... self?.tableView.reloadData() } 3FTVMUTח㢌⻉ָ֮׏׋儗׌ֽ鸐濼ׁ׸׷״ֲח

Slide 22

Slide 22 text

8IFSFUPOEVT ˖ #3FBMN+BQBO6TFS(SPVQGBDFCPPLDPNHSPVQTSFBMNKQ ˖ #5XJUUFSUXJUUFSDPNSFBMN+BQBO ˖ (JU)VCHJUIVCDPNSFBMN ˖ #4UBDL0WFSPXKBTUBDLPWFSPXDPNRVFTUJPOTUBHHFESFBMN ˖ #&NBJMIFMQ!SFBMNJP ˖ #4MBDLTMBDLSFBMNJP

Slide 23

Slide 23 text

3FBMN+BQBO6TFS(SPVQ# GBDFCPPLDPNHSPVQTSFBMNKQ

Slide 24

Slide 24 text

1VCMJD3FBMN4MBDL# slack.realm.io/

Slide 25

Slide 25 text

0DJBM5XJUUFS'BDFCPPL UXJUUFSDPNSFBMN GBDFCPPLDPN

Slide 26

Slide 26 text

0DJBM8FCTJUF# realm.io/jp

Slide 27

Slide 27 text

IUUQCJUMZ3FBMN+1@ ،ٝ؛٦زח׀⼿⸂ֻ׌ְׁ