Ios 核心数据冻结主线程

Ios 核心数据冻结主线程,ios,core-data,Ios,Core Data,我对核心数据有点陌生,在制作游戏点数计数器时遇到了一些古怪的东西 我有以下代码用于为匹配创建新的点对象(静态保持器“button.pointHolder”不是核心数据对象): 当我的核心数据增长时,这似乎会阻塞主线程。(这是一个没有积分持有者的新比赛实例与否无关。当我的核心数据不断增长时,无论发生什么情况,这都是滞后的) 日志: 2013-11-04 11:48:53.059 [463:60b] before block 2013-11-04 11:48:53.060 [463:60b] aft

我对核心数据有点陌生,在制作游戏点数计数器时遇到了一些古怪的东西

我有以下代码用于为匹配创建新的点对象(静态保持器“button.pointHolder”不是核心数据对象):

当我的核心数据增长时,这似乎会阻塞主线程。(这是一个没有积分持有者的新比赛实例与否无关。当我的核心数据不断增长时,无论发生什么情况,这都是滞后的)

日志:

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;
}
Match *newMatch = [NSEntityDescription insertNewObjectForEntityForName:@"Match" inManagedObjectContext:self.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;
    }
}
此外,如果我删除此行:

holderType.match = self.match;
我得到了一个完全响应的用户界面。这让我怀疑它是否与我从“匹配”本身使用的managedObjectContext有关

其他资料:

我正在这样创建我的比赛:

- (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;
}
Match *newMatch = [NSEntityDescription insertNewObjectForEntityForName:@"Match" inManagedObjectContext:self.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;
    }
}
我的管理对象上下文如下:

- (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;
}
Match *newMatch = [NSEntityDescription insertNewObjectForEntityForName:@"Match" inManagedObjectContext:self.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。为什么?你告诉我。我通过在ViewDidEnglish中取消实际的fetchrequest来解决这个问题,反之亦然


谢谢

您可以使用工具分析代码,并在执行语句
holderType.match=self.match时说明到底什么成本如此高昂。您可能还注意到,
insertpointholderfortam
将在主线程上执行,因为
UIManageDocument
managedObjectContext
属性与主线程相关联。在处理核心数据时,我应该使用什么跟踪来获取任何下降输出?一个“时间分析器”这就足以说明发生了什么。似乎每次我添加对象时,父视图控制器(CoreDataTableViewController)都会调用controllerDidChangeContent。这不是我所期望的。fetchrequest适用于类型为“Match”的所有对象。当我向匹配对象添加关系时,为什么它会发出新的请求?Ps.Time Profiler看起来非常棒。非常感谢。我希望我能接受你的评论作为正确答案。