私は Core Data に慣れていないので、ゲームのポイント カウンターを作成するときに奇妙なことに遭遇しました。
一致する新しいポイントオブジェクトを作成するためのこのコードがあります(静的ホルダー「button.pointHolder」はコアデータオブジェクトではありません):
NSLog(@"before block");
[self.match.managedObjectContext performBlock:^{
NSLog(@"in block");
PointHolderType *holderType = [self.matchController insertPointHolderForTeam:self.match.homeTeam withStaticHolder:button.pointHolder];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"in block dispatch_get_main_queue");
//Updating UI
});
}];
NSLog(@"after block");
これは、コア データが増加しているときにメイン スレッドをブロックしているようです。(ポイントホルダーのない新しいマッチインスタンスかどうかは関係ありません。私のコアデータが何があっても成長しているときは遅れています)
ログ:
2013-11-04 11:48:53.059 [463:60b] before block
2013-11-04 11:48:53.060 [463:60b] after block
2013-11-04 11:48:53.062 [463:60b] in block
2013-11-04 11:48:53.606 [463:60b] in block dispatch_get_main_queue
そして、私は次のようにオブジェクトを作成しています:
- (PointHolderType *)insertPointHolderForTeam:(NSString*)team withStaticHolder:(PointHolder *)holder
{
PointHolderType *holderType = [NSEntityDescription insertNewObjectForEntityForName:@"PointHolderType" inManagedObjectContext:self.match.managedObjectContext];
holderType.type = [NSNumber numberWithInt:holder.pointCounterType];
holderType.team = team;
holderType.points = [NSNumber numberWithInteger:holder.pointsAdded];
holderType.match = self.match;
return holderType;
}
また、この行を削除すると:
holderType.match = self.match;
完全にレスポンシブな UI が得られます。これは、「一致」自体から使用している managedObjectContext と関係があるかどうか疑問に思います。
他の情報:
私は次のようにマッチを作成しています:
Match *newMatch = [NSEntityDescription insertNewObjectForEntityForName:@"Match" inManagedObjectContext:self.managedObjectContext];
そして、私の managedObjectContext は次のようになります:
-(void) useDocument
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"brannboll_document"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
if(![[NSFileManager defaultManager] fileExistsAtPath:url.path])
{
//create
[document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if(success)
{
self.managedObjectContext = document.managedObjectContext;
}
}];
}
else if(document.documentState == UIDocumentStateClosed)
{
//Open it
[document openWithCompletionHandler:^(BOOL success) {
self.managedObjectContext = document.managedObjectContext;
}];
}
else //try to use it
{
self.managedObjectContext = document.managedObjectContext;
}
}
何か案は?私は何が欠けていますか?
編集: コメントの CouchDeveloper のおかげで、問題の根本を見つけることができました。Match オブジェクトにリレーションを追加するときに fetchrequest が常に呼び出される、親のコア データ テーブル ビュー コントローラー。なんで?教えてください。viewdiddisappear で実際の fetchrequest を nil-ing することで解決し、その逆も同様でした。
ありがとう!