コアデータの未定義キーのハンドラを設定することはできますか?コアデータの未定義キーの処理
valueForUndefinedKey:
の定義にもかかわらず、valueForKey:
がそのキーを持つ属性を持たない管理対象オブジェクトに対して呼び出された場合、そのメソッドの実装は呼び出されません。
私は現在、オブジェクトをlocallyCreated
またはlocallyDeleted
とマークすることができる同期システムに必要ですが、同時にすべてのオブジェクトが編集可能ではないため、モデル内のすべてのエンティティに対してこれらのプロパティを定義しないようにしたい(約25のエンティティ)。
この目的のために単一の親エンティティを作成するのは魅力的ですが、それはすべてのオブジェクトを1つの巨大なSQLiteテーブルに入れてしまうため、パフォーマンスに悪影響を及ぼすことになります。
他のすべてのエンティティは、このようなコードでは継承され、SOに別の回答で提案されているように現在、私は、remoteID
、locallyCreated
、locallyDeleted
のようないくつかの共通の属性を定義するRemoteObject
呼ばベース「実体」クラスを持っている:
@interface RemoteObject : NSManagedObject
@property (nonatomic) NSString *remoteID;
@property (nonatomic) BOOL locallyCreated;
@property (nonatomic) BOOL locallyDeleted;
@end
@implementation RemoteObject
@dynamic remoteID;
@dynamic locallyCreated;
@dynamic locallyDeleted;
@end
@interface Project : RemoteObject
// custom properties
@end
私が欲しいのは、指定されたRemoteObjet
を調べて、それがローカルに作成または削除されたかどうかを確認することです。しかし、上記のように、エンティティのすべてに対応する属性があるわけではないので、Core Dataは例外をスローします。
私は私がこれらのエラーを回避することを可能にする回避策た - 代わりにクラスメソッドを定義します。
- (id)valueForKeyIfExists:(NSString *)key {
if (self.entity.attributesByName[key] != nil) {
return [self valueForKey:key];
}
return nil;
}
+ (BOOL)objectIsLocallyCreated:(RemoteObject *)object {
return [[object valueForKeyIfExists:@"locallyCreated"] boolValue];
}
をしかし、代わりに、オブジェクトのプロパティにこれをリファクタリングすることが可能であるならば、私はと未定義のキーを引く、思っていましたvalueForUndefinedKey:
次のように:
- (id)valueForUndefinedKey:(NSString *)key {
if ([key isEqualToString:LocallyCreatedKey]
|| [key isEqualToString:LocallyDeletedKey]) {
return @(NO);
}
return [super valueForUndefinedKey:key];
}
- (BOOL)locallyDeleted {
return [[self valueForKey:LocallyDeletedKey] boolValue];
}