Ios 核心数据冻结主线程
我对核心数据有点陌生,在制作游戏点数计数器时遇到了一些古怪的东西 我有以下代码用于为匹配创建新的点对象(静态保持器“button.pointHolder”不是核心数据对象): 当我的核心数据增长时,这似乎会阻塞主线程。(这是一个没有积分持有者的新比赛实例与否无关。当我的核心数据不断增长时,无论发生什么情况,这都是滞后的) 日志: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
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看起来非常棒。非常感谢。我希望我能接受你的评论作为正确答案。