これらのファイルを順番に保存しておき、同じ順序で読み戻す場合は、通常のファイルが最適かもしれません。ただし、何か他のことを行う場合は、CoreDataを使用してください。これは単なるリレーショナルデータベースではありません。永続的なオブジェクトグラフが可能です。また、UIManagedDocument、またはあなた自身の親/子NSManagedObjectContext配列を使用すると、すべてがバックグラウンドスレッドで発生するため、データベースヒットは表示されません。
先に進み、テストしてください。 begin/move/endタッチをオーバーライドし、すべてのタッチでオブジェクトをデータベースにスローします。私が記述しているようにそれをやっているなら、あなたはデータベースヒットに気付かないでしょう。
モデル内の2つのエンティティ、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];
}
オブジェクトの作成にコストがかかる場合は、プライベートコンテキストを作成する方法を追加し、その中ですべての作業を2つのオプションで実行できます。あなたはドキュメントの主なコンテキストに親をおくことができます。その場合、ブロックにコードを埋め込み、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のもののどれもが、すべてのメインスレッド上で実行されません。その場合には兄弟、(UIManagedDocumentのメインコンテキストはメインスレッドで実行されますので、上記のケースでは作ることができます主スレッドはオブジェクトを保存を行うコンテキストに渡します)。ただし、この場合、document.managedObjectContextは、データベースに格納されたものを取得するためにFETCHを実行する必要があります。ただし、ストレージ中にメインスレッドにパフォーマンスが発生しません。
- (NSManagedObjectContext*)moc
{
if (!_moc) {
_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_moc.parentContext = self.document.parentContext;
}
return _moc;
}
これらはデータベースに送られますが、ドキュメントで参照したい場合はフェッチを実行する必要があります。あなたのユースケースに基づいて最適なものを選びなさい。私はあなたが最初の例でうまくいくと思います。