0

私は 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 することで解決し、その逆も同様でした。

ありがとう!

4

0 に答える 0