본문 바로가기
프로그래밍 놀이터/iOS

[ios/tutorial] Core Data - Creating and Modifying Custom Managed Objects

by 돼지왕 왕돼지 2017. 11. 5.
반응형

 [ios/tutorial] Core Data - Creating and Modifying Custom Managed Objects


https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/LifeofaManagedObject.html#//apple_ref/doc/uid/TP40001075-CH16-SW1

@dynamic, awakeFromFetch, awakeFromInsert, BLOB, cache, CLASS, conformsToProtocol, Creating Custom Managed Object Subclasses, Customizing Intialization and Deallocation, dealloc, Defining Properties and Data Storage, description, designated initializer, didTurnIntoFault, dynamic propert, Entity, faulting, generic class, gmt base, Guidelines for Overriding Methods, hash, init, init override, initwithentity, initWithEntity:insertIntoManagedObjectContext, insertintomanagedobjectcontext, insertNewObjectForEntityForName:inManagedObjectContext, isDeleted, isEqual, isFault, isInserted, iskindofclass, isMemberOfClass, isProxy, isUpdated, large binary, life cycle, managed object, managedObjectContext, mapping, NSEntityDescription, NSManagedObject, nstineinterval, objectID, override, performance issue, performSelector:withObject:afterDealy, persistent store, primitiveValueForKey, property 정의, Redo, reinitialized, relationship, repondsToSelector, Self, setPrimitiveValue:forKey:, setValue:forKeyPath:, subclass, superclass, syncthesize, transient value, undo, validateForUpdate, validation method, Value, valueForKey, zone, [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 상태로 만들면서 부른다.





반응형

댓글