0

我在我的应用程序中使用 Core Data,只在 viewDidLoad 中使用此方法一次。当我只添加一次新实体(即按下条形按钮项)时,表格视图数据源方法将一直执行,直到我单击 Xcode 中的停止按钮。并且日志将显示相同计数的 fetch 对象(始终为 1)数千次。我将 NSlog... 函数放在“tableview:nuberOfRowsInSections..”方法中。所以任何人都可以帮助解决这个问题。感谢您。

4

1 回答 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 回答