[ios/tutorial] Core Data - Creating and Modifying Custom Managed Objects
-
NSManagedObject 는 generic class 이다.
Creating Custom Managed Object Subclasses
-
@interface MyManagedObject : NSManagedObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSDate *date;
@end
@implementation MyManagedObject
@dynamic title;
@dynamic date;
@end
Guidelines for Overriding Methods
-
다음은 override 해서는 안 되는 method 들의 list 이다.
primitiveValueForKey:
setPrimitiveValue:forKey:
isEqual:
hash
superclass
class
self
zone
isProxy
isKindOfClass:
isMemberOfClass:
conformsToProtocol:
respondsToSelector:
managedObjectContext
entity
objectID
isInserted
isUpdated
isDeleted
isFault
-
initWithEntity:insertIntoManagedObjectContext: 도 override 하는 것이 비추된다.
description 도 마찬가지이다.
valueForKey:, setValue:forKeyPath: 도 보통 override 하지 않는다.
-
awakeFromInsert, awakeFromFetch 과 validateForUpdate: 등의 validation method 들은 override 할 때 꼭 super 의 녀석을 먼저 호출해주도록 한다.
Defining Properties and Data Storage
-
보통은 NSEntityDescription 을 통해 property 정의가 다 되기 때문에 다른 instance variable 을 추가하지 않는다.
그러나 필요하다면 추가해도 되긴 하다.
BLOB 과 같이 large binary 를 사용하는 경우는 performance issue 도 생길 수 있다.
-
기본적으로 DB 에서 제공하지 않는 타입의 value 를 사용할 경우에도 subclass 를 만들어야 한다.
그래서 mapping 을 해주는 것이 필요하다.
-
NSManagedObject 는 NSTimeInterval (GMT base) 이라는 value 로 저장하고 있는다.
Timezone 정보는 명시적으로 저장되지 않는다.
Customizing Intialization and Deallocation
-
Core Data 는 managed object 의 life cycle 을 알아서 관리한다.
faulting, undo 등도 제공한다.
-
Managed object 가 만들어지면, 기본 value 가 채워지며 만들어진다.
추가적인 initialization 이 필요하다면 subclass 에서 해주어야 한다.
-
NSManagedObject 는 3가지의 designated initializer 가 있다.
initWithEntity:insertIntoManagedObjectContext:
awakeFromInsert
awakeFromFetch
-
init 을 override 하지 말아라.
-
initWithEnity:insertIntoManagedObjectContext: 를 override 하면 undo, redo 등을 제대로 수행하지 못할 가능성이 높다.
-
awakeFromInsert 는 처음 만들어졌을 때 호출된다.
initWithEntity:insertIntoManagedObjectContext: 나 insertNewObjectForEntityForName:inManagedObjectContext: 를 호출하면 바로 호출된다.
이곳에 추가적인 initialize 를 할 수 있다.
-
awakeFromFetch 는 persistent store 로부터 fetch 되면서 reinitialized 되면서 불린다.
transient value 나 다른 cache 등을 사용해야 할 때 이 녀석을 override 하면 좋다.
이곳에서 relationship 을 손대면 안된다.
awakeFromFetch 대신 awakeFromInsert 나 performSelector:withObject:afterDealy: 와 같은 녀석을 호출하는 것도 방법 중 하나이다.
-
dealloc 을 override 하지 말아야 한다.
didTurnIntoFault 를 대신 override 하여라.
실제 dealloc 전에 object 를 fault 상태로 만들면서 부른다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[ios] Core Data 사용 시 Cocoa error 1570 (2) | 2017.11.07 |
---|---|
[ios/tutorial] Core Data - Creating and Saving Managed Objects (0) | 2017.11.06 |
[ios/tutorial] Core Data - Fetching Objects (0) | 2017.11.04 |
[ios/tutorial] Core Data - Initializing the Core Data Stack (0) | 2017.11.03 |
[ios/tutorial] Core Data - Creating a Managed Object Model (0) | 2017.11.02 |
댓글