我对 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 来解决它,反之亦然。
谢谢!