17
俺のManaged Objectの使い方 は間違っていた iOS_LT#12 on 2014.4.23 佐藤 新悟

俺のManaged Objectの使い方は間違っていた

Embed Size (px)

DESCRIPTION

Core Dataの

Citation preview

Page 1: 俺のManaged Objectの使い方は間違っていた

俺のManaged Objectの使い方は間違っていた

iOS_LT#12 on 2014.4.23 佐藤 新悟

Page 2: 俺のManaged Objectの使い方は間違っていた

NSManagedObject

• Core Dataで管理されるモデルオブジェクト

• そのまま使っても良いけど、属性にvalueForKey:とかでアクセスしないといけない

• 通常サブクラスでpropertyを定義して使う

Page 3: 俺のManaged Objectの使い方は間違っていた

intとかBOOLにNSNumberを 使わなくてもいい

Page 4: 俺のManaged Objectの使い方は間違っていた

やりがちなこと

// interface @property (nonatomic, strong) NSNumber *flag;

// implementation - (BOOL)flagValue { return [self.flag boolValue]; } !- (void)setFlagValue:(BOOL)value { self.flag = @(value); }

Page 5: 俺のManaged Objectの使い方は間違っていた

スカラープロパティを使う

Page 6: 俺のManaged Objectの使い方は間違っていた

スカラープロパティを使う

// interface @property (nonatomic, assign) BOOL flag; !// implementation @dynamic flag;

やることはこれだけ!

Page 7: 俺のManaged Objectの使い方は間違っていた

スカラープロパティを使う• Appleのドキュメントにスカラー値を使う場合アクセサは自前で実装しろと書いてあるがこれは古い記述

• XcodeにやらせるとNSDateまでNSTimeintervalになるが気に入らなければNSDateに直せばいい

• スカラーとオブジェクトの変換コストはもちろんある。コレクションに入れたりするならNSNumberのままもあり。

Page 8: 俺のManaged Objectの使い方は間違っていた

属性で扱えないオブジェクトも 自前で変換処理を書かなくていい

Page 9: 俺のManaged Objectの使い方は間違っていた

やりがちなこと// 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の使い方は間違っていた

Transformableを使う

// interface @property (nonatomic, strong) UIColor *color; !// implementation @dynamic color;

やることはこれだけ!

Page 11: 俺のManaged Objectの使い方は間違っていた

Transformableを使う• NSCodingに準拠したオブジェクトはすべて同様に扱える

• 裏でNSValueTransformerが値を変換している

• カスタムのvalue transformerを定義すればNSCoding

じゃないどんなオブジェクトも扱える。

※標準の属性タイプのいずれかに変換できれば

Page 12: 俺のManaged Objectの使い方は間違っていた

entityの継承関係とクラスの 継承関係は一致してなくていい

Page 13: 俺のManaged Objectの使い方は間違っていた

よくある設計

Animal

Cat Human

Animal

Cat Human

Entity Class

NSManagedObject

Page 14: 俺のManaged Objectの使い方は間違っていた

EntityとClassは独立に設計可能

Animal Cat HumanAnimal

Cat Human

Entity Class

NSManagedObject

BaseManagedObject

Page 15: 俺のManaged Objectの使い方は間違っていた

EntityとClassは独立に設計可能• Entityを継承するとDB上ではひとつの大きなテーブルができるので、データの持ち方として効率的ではない

• すべてのManaged Objectで共通にやりたいことをBaseサブクラスに書いて、Entityに対応するクラスはそれを継承する、といったことが可能

Page 16: 俺のManaged Objectの使い方は間違っていた

まとめ• スカラー値のプロパティを使うにはプリミティブ型で宣言するだけでOK

• NSCoding準拠のオブジェクトはTransformable

を使おう

• Entityの階層とClassの階層は独立に設計できる

Page 17: 俺のManaged Objectの使い方は間違っていた

参考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