Realm meetup #6 で発表したSync iOSでのRealmの活用についてです
No Realm, No Lifeyohei SUGIGAMIRealm08/25 Realm Meetup #6
View Slide
iOS DBวྺɾ'.%#ɾ$PSF%BUBɾ.BHJDBM3FDPSEɾ:BQ%BUBCBTFɾ0CKFDUJWF-FWFM%#ɾ$PVDICBTF-JUFɾ3FBMN3FBMN㱺࣮͕͋ΓɺυΩϡϝϯτἧ͍ͬͯΔɹ͍͍͢ɺύϑΥʔϚϯε͕ྑ͍ɺαϙʔτ͕ް͍
ઃܭ͕Ϟμϯ
͞ਖ਼ٛ
υΩϡϝϯτ͕ἧ͍ͬͯΔ
αϙʔτ͕ް͍
How using Realm
Sync iOSϏδωείϛϡχέʔγϣϯಛԽϝοηʔδϯάαʔϏεPowered by RealmCocoa
For our UX requirementsϢʔβʹ௨৴தͷͪΛײͤ͡͞ͳ͍Α͏ʹ㱺ઌಡΈऔಘɺ௨ৗऔಘͷΩϟογϡͷ׆༻RealmΩϟγϡ
For our UX requirementsೖྗதɺૹ৴த ࣦഊʣͳͲͷ్தঢ়ଶͷ෮ݩ㱺ঢ়ଶͷӬଓԽͷ׆༻RealmӬଓԽ
̎ Realm Databases3FBMNҟͳΔϑΝΠϧύεͰ%#Λෳಉ࣌ʹѻ͏͜ͱ͕Ͱ͖ΔRealmӬଓԽ༻Ωϟγϡ༻㱺εΩʔϚఆٛશ%#ڞ௨ʹͳΔͷͰݸผʹϚΠάϨʔγϣϯΛߦ͑ͳ͔ͬͨͨΊࠓճݟૹΓ
$BSUpMFHJUIVCSFBMNSFBMNDPDPBɹɹHow install realm-cocoa$BSUIBHFܦ༝ͰΠϯετʔϧ$PDPB1PETͩͱ4XJGUϥΠϒϥϦͷίϯύΠϧ͕͍ͨΊ 4XJGUܥϥΠϒϥϦੵۃతʹ$BSUIBHFͰΠϯετʔϧ3FBMN4XJGUΛར༻݄̔̎̏࣌ͷ࠷৽W
Realm Objects(SPVQ6TFS6TFS.FTTBHF6TFS*NBHF'JMF<.FNCFSTIJQ> -JOL<.FOUJPO>5PUBMNPEFMT
Introduce Realm։ൃॳظ͔Β3FBMNΛಋೖͨ͠Θ͚Ͱͳ͘։ൃͷ్த͔ΒಋೖʢΩϟγϡɺӬଓԽػߏͷͳ͍ঢ়ଶʣ1VSF$MBTTΛ3FBMN0CKFDUܧঝϓϩύςΟΛ3FBMNܗࣜʹ؆୯ʹಋೖͰ͖·ͨ͠
RealmObjectfinal class Message: Object {dynamic var user = User()dynamic var image = MessageImage()dynamic var file = MessageFile()dynamic var link = MessageLink()dynamic var channelId = ""dynamic var content = ""var avatarImageURL: NSURL { return NSURL(string: user.avatarImageURL)! }class func fromJSONInner(json: JSON) -> Message {let message = Message()message.messageId = json["message_id"].stringValuemessage.content = json["content"].stringValueif json["image"].null == nil {message.image = MessageImage.fromJSON(json["image"])}if json["file"].null == nil {message.file = MessageFile.fromJSON(json["file"])}/463-1SJNJUJWF 4USJOHͰอଘͯ͠$PNQVUFE1SPQFSUZͰදݱ+40/͔Β0CKFDUΛ࡞
RealmObjectenum MobileNotificationPreference: String {case AllActivities = "all_activities"case OnlyMentions = "only_mentions"case Nothing = "nothing"}final class Group: Object {dynamic var mobileNotificationPreferenceRaw: String =MobileNotificationPreference.OnlyMentions.rawValuevar mobileNotificationPreference: MobileNotificationPreference {return MobileNotificationPreference(rawValue: mobileNotificationPreferenceRaw)}FOVNͦͷ··อଘͰ͖ͳ͍ͷͰ3BXͰอଘͯ͠$PNQVUFE1SPQFSUZͰදݱ
RealmObjectfinal class Message: Object {… override class func primaryKey() -> String {return "messageId"}override class func indexedProperties() -> [String] {return ["groupId"]}override class func ignoredProperties() -> [String] {return ["groupName"]}QSJNBSZ,FZ JOEFYFE1SPQFSUJFT JHOPSFE1SPQFSUJFTΛઃఆ
RealmObjectfinal class Message: Object {… class func find(pkey: String) -> Message? {return Realm().objectForPrimaryKey(Message.self, key: pkey)}class func findByChannel(groupId: String) -> Results {let predicate = NSPredicate(format: "groupId = %@", groupId)return Realm().objects(Message).filter(predicate).sorted("createdAtRaw", ascending: false)}3FBMNͷPCKFDUܥϝιουΛϥοϓͯ͠4VHBS4ZOUBYΛ࡞
Background// Queuelet RealmBackgroundSaveQueue = dispatch_queue_create("com.wantedly.sync.realm", DISPATCH_QUEUE_SERIAL)class func saveJSON(json: JSON, closure: (group: Group) -> Void) {Async.customQueue(RealmBackgroundSaveQueue) {Realm().write {let group = Group.fromJSON(json)Realm().add(group, update: true)}Async.main {let group = Group.fromJSON(json)closure(group: group)}}}3FBMNߋ৽ઐ༻ͷ4FSJBM2VFVFΛ࡞ͯ͠ஞ࣍తʹߋ৽#BDLHSPVOEͰ࡞ͨ͠3FBMN0CKFDU.BJOͰ৮ΔͱΫϥογϡอଘ༻ͱར༻༻Ͱ͚ͯΠϯελϯεΛ࡞"TZOD4XJGUͷ($%Λϥοϓ͢ΔϥΠϒϥϦ
Migration// MARK: Initializeextension AppDelegate {func initializeRealm() {let BuildVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! Stringlet thisVersion = UInt64(BuildVersion.toInt()!)setSchemaVersion(thisVersion, Realm.defaultPath) { migration, oldSchemaVersion inif oldSchemaVersion < thisVersion {// Nothing to do}}logger.debug("Realm Default Path [\(Realm.defaultPath)]")}}େͷ.JHSBUJPOͱͬͯ؆୯4DIFNB7FSTJPOΛ্͛Δ͚ͩ4ZODͰ$'#VOEMF7FSTJPOͱ࿈ಈͯࣗ͠ಈԽ
ɾ։ൃ͍͢͠ɾӡ༻͍͢͠ɾΤϯδχΞʹ͍͞͠Conclusionɾ͏$PSF%BUBʹΕͳ͍
Enjoy Realm life.