순서대로 저장 한 다음 동일한 순서로 다시 읽으려면 일반 파일이 가장 적합 할 수 있습니다. 그러나 다른 작업을 수행하려면 CoreData를 사용하십시오. 그것은 단지 관계형 데이터베이스가 아닙니다. 그것은 영구 객체 그래프를 허용합니다. 또한 UIManagedDocument 또는 자신의 부모/자식 NSManagedObjectContext 배열을 사용하는 경우에는 모두 백그라운드 스레드에서 발생하기 때문에 데이터베이스 히트가 표시되지 않습니다.
가서 테스트 해보세요. 시작/이동/끝 접촉을 재정의하고 매 터치시 데이터베이스에 객체를 던집니다. 내가 설명하는대로 당신이 그것을하고 있다면, 당신은 심지어 데이터베이스 히트를 통지하지 않습니다.
MyTouchEvent가 MyTouch와 일대 다 관계를 갖는 MyTouchEvent 및 MyTouch 모델의 두 엔터티를 사용한다고 가정합니다.
// Call this from touchesBegan, touchesMoved, and touchesEnded...
- (void) saveTouches:(NSSet*)touches kind:(NSString*)kind
{
NSManagedObjectContext *moc = self.document.managedObjectContext;
MyTouchEvent *myTouchEvent = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouchEvent" inManagedObjectContext:moc];
myTouchEvent.kind = kind;
for (UITouch *touch in touches) {
CGPoint touchPoint = [touch locationInView:self];
MyTouch *myTouch = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouch" inManagedObjectContext:moc];
myTouch.x = [NSNumber numberWithFloat:touchPoint.x];
myTouch.y = [NSNumber numberWithFloat:touchPoint.y];
[myTouchEvent addTouchesObject:myTouch];
}
[self.document updateChangeCount:UIDocumentChangeDone];
}
개체 생성에 비용이 많이 드는 경우 개인용 컨텍스트를 만드는 방법을 추가하고 두 가지 옵션을 사용하여 모든 작업을 수행 할 수 있습니다. 당신은 그것을 문서의 메인 컨텍스트에 적용 할 수 있습니다.이 경우, 블록에 코드를 삽입하고 MOC에서 save를 호출하면됩니다.
- (NSManagedObjectContext*)moc
{
if (!_moc) {
_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_moc.parentContext = self.document.managedObjectContext;
}
return _moc;
}
- (void) saveTouches:(NSSet*)touches kind:(NSString*)kind
{
NSManagedObjectContext *moc = self.moc;
[self.moc preformBlock:^{
MyTouchEvent *myTouchEvent = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouchEvent" inManagedObjectContext:moc];
myTouchEvent.kind = kind;
for (UITouch *touch in touches) {
CGPoint touchPoint = [touch locationInView:self];
MyTouch *myTouch = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouch" inManagedObjectContext:moc];
myTouch.x = [NSNumber numberWithFloat:touchPoint.x];
myTouch.y = [NSNumber numberWithFloat:touchPoint.y];
[myTouchEvent addTouchesObject:myTouch];
}
NSError *error = nil;
[moc save:&error];
}];
}
또는, 당신은 그것을 DB 물건의 경우 어느 것도 모두에서 메인 스레드에서 실행하지하는 형제, (A UIManagedDocument의 주요 컨텍스트 만들 수는 위의 경우에, 그래서 메인 스레드에서 실행 주 스레드는 개체를 저장 작업을 수행하는 컨텍스트로 전달합니다. 그러나이 경우 document.managedObjectContext는 데이터베이스에 저장된 내용을 가져 오기 위해 FETCH를 수행해야합니다. 그러나 저장 중에는 주 스레드에 성능이 없습니다.
- (NSManagedObjectContext*)moc
{
if (!_moc) {
_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_moc.parentContext = self.document.parentContext;
}
return _moc;
}
이제는 데이터베이스로 이동 하겠지만, 문서에서 볼 수있게하려면 가져 오기를 수행해야합니다. 사용 사례에 따라 가장 적합한 것을 선택하십시오. 그래도 첫 번째 예에서는 괜찮을 것이라고 생각합니다.