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,我设法找到了问题的根源;我的父级核心数据表视图控制器,在将关系添加到匹配对象时,它的 fetchrequest 不断被调用。为什么?你告诉我。我通过在 viewdiddisappear 中取消实际的 fetchrequest 来解决它,反之亦然。

谢谢!

4

0 回答 0