Download - 俺のManaged Objectの使い方は間違っていた
![Page 1: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/1.jpg)
俺のManaged Objectの使い方は間違っていた
iOS_LT#12 on 2014.4.23 佐藤 新悟
![Page 2: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/2.jpg)
NSManagedObject
• Core Dataで管理されるモデルオブジェクト
• そのまま使っても良いけど、属性にvalueForKey:とかでアクセスしないといけない
• 通常サブクラスでpropertyを定義して使う
![Page 3: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/3.jpg)
intとかBOOLにNSNumberを 使わなくてもいい
![Page 4: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/4.jpg)
やりがちなこと
// interface @property (nonatomic, strong) NSNumber *flag;
// implementation - (BOOL)flagValue { return [self.flag boolValue]; } !- (void)setFlagValue:(BOOL)value { self.flag = @(value); }
![Page 5: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/5.jpg)
スカラープロパティを使う
![Page 6: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/6.jpg)
スカラープロパティを使う
// interface @property (nonatomic, assign) BOOL flag; !// implementation @dynamic flag;
やることはこれだけ!
![Page 7: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/7.jpg)
スカラープロパティを使う• Appleのドキュメントにスカラー値を使う場合アクセサは自前で実装しろと書いてあるがこれは古い記述
• XcodeにやらせるとNSDateまでNSTimeintervalになるが気に入らなければNSDateに直せばいい
• スカラーとオブジェクトの変換コストはもちろんある。コレクションに入れたりするならNSNumberのままもあり。
![Page 8: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/8.jpg)
属性で扱えないオブジェクトも 自前で変換処理を書かなくていい
![Page 9: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/9.jpg)
やりがちなこと// interface !// attribute @property (nonatomic, strong) NSString *colorString; // attributeじゃない @property (nonatomic, strong) UIColor *color; !!// implementation - (UIColor *)color { UIColor *color = nil; // self.colorString のカラーコードからUIColorを作る return color; } !- (void)setColor:(UIColor *)color { NSString *colorString = nil; // UIColorからカラーコードの文字列を作る self.colorString = colorString; }
![Page 10: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/10.jpg)
Transformableを使う
// interface @property (nonatomic, strong) UIColor *color; !// implementation @dynamic color;
やることはこれだけ!
![Page 11: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/11.jpg)
Transformableを使う• NSCodingに準拠したオブジェクトはすべて同様に扱える
• 裏でNSValueTransformerが値を変換している
• カスタムのvalue transformerを定義すればNSCoding
じゃないどんなオブジェクトも扱える。
※標準の属性タイプのいずれかに変換できれば
![Page 12: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/12.jpg)
entityの継承関係とクラスの 継承関係は一致してなくていい
![Page 13: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/13.jpg)
よくある設計
Animal
Cat Human
Animal
Cat Human
Entity Class
NSManagedObject
![Page 14: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/14.jpg)
EntityとClassは独立に設計可能
Animal Cat HumanAnimal
Cat Human
Entity Class
NSManagedObject
BaseManagedObject
![Page 15: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/15.jpg)
EntityとClassは独立に設計可能• Entityを継承するとDB上ではひとつの大きなテーブルができるので、データの持ち方として効率的ではない
• すべてのManaged Objectで共通にやりたいことをBaseサブクラスに書いて、Entityに対応するクラスはそれを継承する、といったことが可能
![Page 16: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/16.jpg)
まとめ• スカラー値のプロパティを使うにはプリミティブ型で宣言するだけでOK
• NSCoding準拠のオブジェクトはTransformable
を使おう
• Entityの階層とClassの階層は独立に設計できる
![Page 17: 俺のManaged Objectの使い方は間違っていた](https://reader033.vdocuments.net/reader033/viewer/2022052316/558fc4021a28ab8d318b45bb/html5/thumbnails/17.jpg)
参考URL
• Core Dataでスカラー値をプリミティブ型のプロパティで扱う方法 -
Qiitahttp://qiita.com/gonsee/items/4daff9c7c86e8cae836b
• Data Models and Model Objects - Core Data - objc.io issue #4http://www.objc.io/issue-4/core-data-models-and-model-objects.html
• Core Data Programming Guide: Non-Standard Persistent Attributeshttps://developer.apple.com/library/ios/documentation/cocoa/conceptual/CoreData/Articles/cdNSAttributes.html#//apple_ref/doc/uid/TP40001919-SW1