それらを順番に保存するだけで、同じ順序で読み返す場合は、おそらく通常のファイルが最適です。ただし、それ以外のことを行う場合は、CoreData を使用してください。単なるリレーショナル データベースではありません。永続的なオブジェクト グラフを許可します。また、UIManagedDocument、または独自の親/子 NSManagedObjectContext 配置を使用する場合、すべてバックグラウンド スレッドで発生するため、データベース ヒットさえ表示されません。
さあ、試してみてください。開始/移動/終了タッチをオーバーライドし、タッチするたびにオブジェクトをデータベースにスローします。説明どおりに実行している場合は、データベース ヒットにさえ気付かないでしょう。
モデル内の 2 つのエンティティ、MyTouchEvent と MyTouch を想定しています。ここで、MyTouchEvent は MyTouch と 1 対多の関係にあります。
// 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;
}
これで、これらはデータベースに送られますが、ドキュメントがそれらを見たい場合は、フェッチを実行する必要があります。ユースケースに基づいて最適なものを選択してください。ただし、最初の例では問題ないと思います。