managed对象是NSManagedObject
类的实例或者NSManagedObject
的子类。代表了entity的实例。NSManagedObject
实现了所有managed object所需的基本行为。你也可以自定义NSManagedObject
类,尽管不是必须的。一般自定义的类提供访问或者验证的方法。使用非标准的属性,指定依赖keys,计算派生值并且实现其它自定义逻辑。
Creating Custom Managed Object Subclasses
In an Objective-C managed object subclass, you can declare the properties for modeled attributes in the interface file, but you don’t declare instance variables:
@interface MyManagedObject :NSManagedObject
@property (nonatomic,strong)NSString*title;
@property (nonatomic,strong)NSDate*date;
@end
Notice that the properties are declared as nonatomic
and strong
. For performance reasons,Core Data typically does not copy object values, even if the value class adopts theNSCopying
protocol.
In the Objective-C implementation file, you specify the properties asdynamic
:
@implementation MyManagedObject
@dynamic title;
@dynamic date;
@end
In Swift, you declare the properties using the @NSManaged
keyword:
class MyManagedObject:NSManagedObject {
@NSManaged var title: String?
@NSManaged var date: NSDate?
}
core data动态生成get和set方法和关系,因此,你不用再自定义访问方法。
Guidelines for Overriding Methods
NSManagedObject
自定义了许多NSObject
的特性银耳managed objects可以合理的整合入core data中。core data依赖NSManagedObject
的如下实现方法,你不应该复写:
primitiveValueForKey:
setPrimitiveValue:forKey:
isEqual:
hash
superclass
class
self
zone
isProxy
isKindOfClass:
isMemberOfClass:
conformsToProtocol:
respondsToSelector:
managedObjectContext
entity
objectID
isInserted
isUpdated
isDeleted
isFault
你不应该复写initWithEntity:insertIntoManagedObjectContext:
,因为这个description会在你调试过程中触发错误,结果可能是未知的。也不应该复写valueForKey:
和 setValue:forKeyPath:
.
在复写awakeFromInsert
,awakeFromFetch
,的时候,验证方法例如validateForUpdate:
,调用它们的父类实现。
Defining Properties and Data Storage
NSManagedObject
像一个字典。是一个通常的容器提供NSEntityDescription
相关对象定义的属性存储。NSManagedObject
为属性提供通用的类型,包括字符串,日期,和数字。因此,你不需要在子类中定义实例变量。但是,如果你需要实现非标准的属性或者时区,你可能需要这样做。除此之外,有一些考量可以使用子类比如如果你使用大量二进制数据对象。可以查看Binary Large Data Objects (BLOBs)。
Using Nonstandard Attributes
By default, NSManagedObject
stores its properties as objects in an internal structure, and in general Core Data is more efficient working with storage under its own control than with using custom instance variables.
默认的,NSManagedObject
将他的属性作为对象存储在外部结构中。
有时你需要使用不支持的数据类型,比如颜色和c结构体。例如,在图形程序中,你可能想定义一个有颜色和bounds属性的矩形实体,这就需要你创建一个NSManagedObject
的子类。
Dates, Times, and Preserving Timezones
NSManagedObject
使用NSDate
来表示日期属性,并且将时间戳作为NSTimeInterval
类存储,并且是基于GMT的。time zone并不显示的存储。你的确应该基于gmt来表示core data的日期类型,以便搜索在数据库可以标准化。如果你需要保留time zone信息,你需要把这个time zone属性存储在你的model中,这就需要创建一个NSManagedObject
的子类。
Customizing Initialization and Deallocation
core data控制managed objects的生命周期。managed objects可以被安装,销毁如果需要的话。
当managed object被创建时,会被赋予初始值。
在典型的objc类中,你通常在init方法中复写初始化方法。在NSManagedObject
中,有三种不同的方式可以自定义初始化方法。通过复写initWithEntity:insertIntoManagedObjectContext:
,或者 awakeFromFetch
或者awakeFromInsert
。不要复写init。而且不建议initWithEntity:insertIntoManagedObjectContext:
复写来自定义初始化方法。
awakeFromInsert
在对象的生命周期中只被调用一次。
awakeFromInsert
当你调用了initWithEntity:insertIntoManagedObjectContext:
或者insertNewObjectForEntityForName:inManagedObjectContext:
.后,会马上被调用。你可以使用awakeFromInsert
来初始化特殊的默认值属性。例如日期对象的创建。如下例:
- (void)awakeFromInsert
{
[superawakeFromInsert];
[self setCreationDate:[NSDate date]];
}
override funcawakeFromInsert() {
super.awakeFromInsert()
creationDate = NSDate()
}
awakeFromFetch
在持久化对象被重新初始化的时候被调用(在请求期间)
你可以复写awakeFromFetch
,例如,创建临时值和其它缓存。awakeFromFetch
中不能显示的修改执行,所以可以使用公共的set方法。禁止改变操作意味着,尽管如此但是,你不应该操作关系,因为变动可能不会合理的传播到目标对象或者对象群中。你可以使用wakeFromInsert而不是
wakeFromFetch
或者performSelector:withObject:afterDelay:
.方法。
复写didTurnIntoFault
而不是dealloc来释放属性和变量等。在对象被析构时会自动调用
didTurnIntoFault
。