早上好。
我在设备上运行应用程序时遇到问题,当我在主表格中滚动时,它会滞后/断断续续。
我已经将问题缩小到从tableCell内部调用核心数据
- 在indexPath的行的单元格中 person是一个自定义类,联系人管理器是我的文件,包含对核心数据和操作数据的所有调用
person.contactSelected = [contactManager checkContactSelectedStatus:person];
- 在我的contactManager文件中,调用将转到此功能。
并且只更新联系人所选择的状态(当用户按下按钮以改变通话中允许或不通话时)
-(NSNumber *) checkContactSelectedStatus:(ContactPerson *)person{
SWNAppDelegate *delegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = [delegate managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context];
NSFetchRequest *req =[[NSFetchRequest alloc]init];
[req setEntity:entity];
NSPredicate *pred =[NSPredicate predicateWithFormat:@"(recordID like %@)",[person.recordID stringValue]];
[req setPredicate:pred];
NSError *error;
NSManagedObject *checkStatus = [[context executeFetchRequest:req error:&error] objectAtIndex:0];
person.contactSelected = [checkStatus valueForKey:@"isSelected"];
return person.contactSelected;}
有没有一种简单的方法可以将其投入队列?我已阅读并试图弄清楚如何将NSManagedObject发送到队列,但是当我创建父MoC的子项时,它找不到实体“联系人”。我不知道是否有更简单的方法可以做到这一点!?
感谢您的时间,和 WhatWasIThinking!?!?!
答案 0 :(得分:0)
是的,这是非常低效的代码。提取必须多次完成,即每个单元变为可见时。
您应该使用专门用于表视图的NSFetchedResultsController
。它将决定适当的商店出行次数,以便优化速度和内存占用。
此外,您很可能会使用少得多的代码。
此外,像recordID like %@
这样的谓词字符串没有多大意义。如果您使用ID,它们应该是唯一的,这样您就可以将它们编入索引并快速查找它们。 LIKE
,就像CONTAINS
这样的字符串函数相比,速度非常慢。