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

3FBMN0CKFDUJWF$4XJGU+BWB IUUQTSFBMNJPKQOFXTSFBMN

Slide 5

Slide 5 text

3FDFOU6QEBUFT

Slide 6

Slide 6 text

3FBMN0CKFDUJWF$4XJGU XBT

Slide 7

Slide 7 text

Realm Objective-C/Swift 0.99.0 ˖ 'JOFHSBJOFE/PUJDBUJPOT

Slide 8

Slide 8 text

Realm Objective-C/Swift 0.100.0 ˖ 鷞倯ぢךꟼ鸬ךفٗػذ؍⻉ - RLMLinkingObjects / LinkingObjects

Slide 9

Slide 9 text

Realm Objective-C/Swift 0.101.0 ˖ 傈➰/4%BUF㘗ךفٗػذ؍דشظ猱תדך礵䏝׾؟ه٦ز ؿ؋؎ٕؿؓ٦وحزך㢌刿 ⟃⵸ךغ٦آّٝדכؿ؋؎ָٕꟚֽזֻז׶תׅ ˖ 醱侧أٖحس꟦ךًٌٔوحفךⰟ剣 ˖ ػؿؓ٦وٝأךぢ♳

Slide 10

Slide 10 text

Realm Objective-C/Swift 0.102.0 ˖ فٗػذ؍せ׾㢌刿ׅ׷و؎ؚٖ٦ءّٝך؟ه٦ز - Migration.renamePropertyForClass(_:oldName:newName:) ˖ و؎ؚٖ٦ءָّٝ䗳銲ז㜥さחؿ؋؎ٕ׾⵴ꤐ׃גⱄ欰䧭ׅ׷ ؔفءّٝ EFMFUF3FBMN*G.JHSBUJPO/FFEFE

Slide 11

Slide 11 text

Realm Objective-C/Swift 0.103.0 ˖ ꬊ䱿㤺ך"1*ה堣腉׾⵴ꤐ ˖ 9DPEFYה4XJGU⟃⵸ך؟ه٦ز׾⵴ꤐ

Slide 12

Slide 12 text

Realm Objective-C/Swift 1.0.0

Slide 13

Slide 13 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 14

Slide 14 text

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

Slide 15

Slide 15 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 16

Slide 16 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 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

-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 19

Slide 19 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 20

Slide 20 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 21

Slide 21 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 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

-JOLJOHPCKFDUTQSPQFSUJFT var owner?: Person { return linkingObjects(...).first }

Slide 26

Slide 26 text

-JOLJOHPCKFDUTQSPQFSUJFT let owner = LinkingObjects(...).first

Slide 27

Slide 27 text

-JOLJOHPCKFDUTQSPQFSUJFT let owner = LinkingObjects(...).first

Slide 28

Slide 28 text

-JOLJOHPCKFDUTQSPQFSUJFT let owner: Person = LinkingObjects(...).first

Slide 29

Slide 29 text

-JOLJOHPCKFDUTQSPQFSUJFT let owners = LinkingObjects(...) var owner: Person? { return owners.first }

Slide 30

Slide 30 text

/4%BUFOBOPTFDPOETTVQQPSU let results = realm.objects(Article) let article = results.first! let dateFormatter = NSDateFormatter() dateFormatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! dateFormatter.dateFormat = “yyyy-MM-dd'T'HH:mm:ss.SSS" print(dateFormatter.stringFromDate(article.creationDate)) // => 2016-05-27T16:28:38.172 let component = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! .components([.Year, .Month, .Day, .Hour, .Minute, .Second, .Nanosecond], fromDate: article.creationDate) print(“\(c.year)-\(c.month)-\(c.day)T\(c.hour):\(c.minute):\(c.second).\(c.nanosecond)”) // => 2016-5-27T16:28:38.172492027

Slide 31

Slide 31 text

3FBMN2VJ[5JQT

Slide 32

Slide 32 text

2 ؙؒٔךػؿؓ٦وٝأ

Slide 33

Slide 33 text

ؙؒٔךػؿؓ٦وٝأ class Article: Object { ... } class Comment: Object { ... } class User: Object { ... }

Slide 34

Slide 34 text

ؙؒٔךػؿؓ٦وٝأ let articles = realm .objects(Article) ו׍׵ָ鸞ְד׃׳ֲ let recentArticles = realm.objects(Article) .filter("modificationDate > ...") .filter("deletionDate != nil") .sorted("modificationDate", ascending: false)

Slide 35

Slide 35 text

瘶ִ ו׍׵׮ずׄ

Slide 36

Slide 36 text

ؙؒٔךػؿؓ٦وٝأחאְג ו׍׵׮ֿך儗挿דכ嗚稊勴⟝׾⥂䭯׃גְ׷׌ֽկ 㹋ꥷךؙؒٔכ㹋遤ׁ׸זְկ let articles = realm .objects(Article) let recentArticles = realm.objects(Article) .filter("modificationDate > ...") .filter("deletionDate != nil") .sorted("modificationDate", ascending: false)

Slide 37

Slide 37 text

ؙؒٔךػؿؓ٦وٝأחאְג ו׍׵׮ֿך儗挿דכ嗚稊勴⟝׾⥂䭯׃גְ׷׌ֽկ 㹋ꥷךؙؒٔכ㹋遤ׁ׸זְկ let articles = realm .objects(Article) return articles.count let recentArticles = realm.objects(Article) .filter("modificationDate > ...") .filter("deletionDate != nil") .sorted("modificationDate", ascending: false) recentArticles[indexPath.row]

Slide 38

Slide 38 text

׮׃ָؙؒٔ鹼ְ㜥さכ غحؙؚٓؐٝسؙؒٔ׾ⵃ欽ׅ׷ notificationToken = realm.objects(Article) .filter("modificationDate > ...") .filter("deletionDate != nil") .sorted("modificationDate", ascending: false) .addNotificationBlock { (changes: RealmCollectionChange) in switch changes { case let .Initial(results): ... case let .Update(results, deletions, insertions, modifications): ... case let .Error(error): ... } } ؙؒٔכغحؙؚٓؐٝسד㹋遤ׁ׸ծ 㸣✪׃׋儗挿ד؝٦ٕغحָؙㄎל׸׷

Slide 39

Slide 39 text

2 و؎ؚٖ٦ءّٝ 0CK$4XJGUPOMZ

Slide 40

Slide 40 text

و؎ؚٖ٦ءّٝ و؎ؚٖ٦ءّٝכ䗳銲 class User: Object { dynamic var id = 0 dynamic var name = "" } class User: Object { dynamic var id = 0 dynamic var name = "" dynamic var age 0 }

Slide 41

Slide 41 text

瘶ִ 䗳銲

Slide 42

Slide 42 text

و؎ؚٖ٦ءّٝ و؎ؚٖ٦ءّٝכ䗳銲 class Article: Object {...} class Comment: Object {...} class User: Object {...} class Article: Object {...} class Comment: Object {...} class User: Object {...} class News: Object {...}

Slide 43

Slide 43 text

瘶ִ ♶銲

Slide 44

Slide 44 text

و؎ؚٖ٦ءّٝ و؎ؚٖ٦ءّٝכ䗳銲 class User: Object { dynamic var id = 0 dynamic var name = “" } class User: Object { dynamic var id = 0 dynamic var name = "" class override func indexedProperties() -> [String] { return ["name"] } }

Slide 45

Slide 45 text

瘶ִ ♶銲

Slide 46

Slide 46 text

و؎ؚٖ٦ءّٝ5JQT 荈⹛و؎ؚٖ٦ءّٝ 0CK$4XJGUPOMZ let config = Realm.Configuration(schemaVersion: 4) let realm = try! Realm(configuration: config) ...

Slide 47

Slide 47 text

و؎ؚٖ٦ءّٝךתה׭ و؎ؚٖ٦ءָّٝ䗳銲 ˖ فٗػذ؍ך鷄⸇٥⵴ꤐ ˖ فٗػذ؍ךせ⵸㢌刿 ˖ فٗػذ؍ך/6--〳٥♶〳ך㢌刿 ˖ فٓ؎ؤؗ٦ך㢌刿 و؎ؚٖ٦ءّٝ♶銲 ˖ ؙٓأך鷄⸇٥⵴ꤐ ˖ ؎ٝرحؙأך鷄⸇٥⵴ꤐ

Slide 48

Slide 48 text

و؎ؚٖ٦ءّٝךתה׭ 荈⹛و؎ؚٖ٦ءّٝ ˖ ⦼׾獳遤ׅ׷䗳銲ָזֽ׸ל荈⹛و؎ؚٖ٦ءָّٝ⢪ִ׷ 0CK$4XJGUך׫

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

3FBMN+BQBO6TFS(SPVQ# GBDFCPPLDPNHSPVQTSFBMNKQ

Slide 51

Slide 51 text

1VCMJD3FBMN4MBDL# slack.realm.io/

Slide 52

Slide 52 text

0DJBM5XJUUFS'BDFCPPL UXJUUFSDPNSFBMN GBDFCPPLDPN

Slide 53

Slide 53 text

0DJBM8FCTJUF# realm.io/jp

Slide 54

Slide 54 text

*O88%$XFFL ˖ 4XJGU1BOFM 剢։ ˖ /4)JQTUFS1VC2VJ[ 抟։ ˖ 3FBMN-BVODIQBSUZ 加։

Slide 55

Slide 55 text

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