核心数据冻结主线程

时间:2013-11-04 11:00:29

标签: ios core-data

我对Core Data有点新手,在为游戏制作点计数器时遇到了一些奇怪的东西。

我有这个代码用于为匹配创建一个新的Point对象(静态持有者“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;

我获得了完全响应的用户界面。这让我想知道它是否与我在“匹配”本身使用的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在评论中,我设法找到了问题的根源;我的父Core Data Table View控制器,在向Match-object添加关系时不断调用fetchrequest。为什么?你告诉我。我通过在viewdiddisappear中查找实际的fetchrequest,以及副verca来解决它。

谢谢!

0 个答案:

没有答案