我在我的应用程序中使用 Core Data,只在 viewDidLoad 中使用此方法一次。当我只添加一次新实体(即按下条形按钮项)时,表格视图数据源方法将一直执行,直到我单击 Xcode 中的停止按钮。并且日志将显示相同计数的 fetch 对象(始终为 1)数千次。我将 NSlog... 函数放在“tableview:nuberOfRowsInSections..”方法中。所以任何人都可以帮助解决这个问题。感谢您。
问问题
192 次
1 回答
0
在查看源代码后,我看到的是:
具有主要实体的模板核心数据项目EDLabel
。
声明的实现文件EDLabel
:
@property (nonatomic, retain) NSDate * labelDate;
@property (nonatomic, retain) NSString * labelName;
@property (nonatomic, retain) NSNumber * rowNum;
获取请求(由 FRC 使用):
NSFetchRequest *req = [[NSFetchRequest alloc] init];
NSEntityDescription *des = [NSEntityDescription entityForName:@"EDLabel"
inManagedObjectContext:self.context];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"labelDate" ascending:NO];
req.entity = des;
req.sortDescriptors = [NSArray arrayWithObject:sort];
插入代码:
-(void)addNewLabel:(id)sender
{
NSLog(@"%@", NSStringFromSelector(_cmd));
EDLabel *edLabel = (EDLabel *)[NSEntityDescription insertNewObjectForEntityForName:@"EDLabel"
inManagedObjectContext:self.context];
edLabel.labelName = @"New Label";
edLabel.labelDate = [NSDate date];
if(![self.context save:nil]) NSLog(@"Save failed!");
}
有问题的问题是单元配置方法:
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
EDLabel *label = [self.fetchController objectAtIndexPath:indexPath];
label.rowNum = [NSNumber numberWithInteger:indexPath.row];//<-- this is the problem
//some more configurations
}
由于每次更新主上下文时都会调用此代码(如果 FRC 的对象有任何更改),并且此代码会修改数据本身(因为它重置了rowNum
属性),所以我们在主循环结束(当主上下文调用processPendingChanges
.
rowNum
要解决这个问题,要么删除更新行(因为视图中的排序是按插入日期完成的),要么测试by usingNSNumber
compare:
方法是否有变化。
于 2013-04-28T17:44:34.003 回答