核心数据获取属性。更新后刷新

时间:2013-04-17 11:36:45

标签: iphone ios objective-c core-data

我有UITableView和NSFetchedResultsController以及附加到它的主要上下文。 我正在从背景更新我的主要背景。

- (void)contextDidSave:(NSNotification *)notification
{
    NSManagedObjectContext *context=[self managedObjectContext];
    [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification waitUntilDone:YES];

    if ([context hasChanges])
    {            
        [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:YES];

    }        
}

我的UITableView重新加载了新数据,一切都很好,但是某些UITableView单元格的数据必须从获取的属性中填充,我需要刷新这些值。

我已经阅读了NSManagedObjectContext的方法refreshObject:mergeChanges:这可能会有所帮助。我应该把它放在哪里?如果我将它放在cellForRowAtIndexPath的辅助方法 - configureCell:atIndexPath:这将导致循环行更新。

以下是单元格配置代码:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)theIndexPath
{
    //NSLog(@"PTAgencyList: configureCell: atIndexPath: %i %i", theIndexPath.section, theIndexPath.row);

    NSManagedObject *managedObj=[self.agenciesFetchedResultsController objectAtIndexPath:theIndexPath];
    if (managedObj==nil)
    {
        NSLog(@"PANIC: fetchedResultsController objectAtIndexPath: returned nil object");
        return;
    }
    else
    {

        CDAgency *agency=(CDAgency *)managedObj;

        [agency city];
        NSLog(@"agency.city_server_id: %@", agency.city_server_id);
        NSLog(@"agency.city.name: %@", ((CDCities *)[[agency city] objectAtIndex:0]).name);
        NSFetchRequest *fr=[[NSFetchRequest alloc] init];
        [fr setEntity:[NSEntityDescription entityForName:@"Cities" inManagedObjectContext:self.context]];
        [fr setPredicate:[NSPredicate predicateWithFormat:@"server_id=%@", agency.city_server_id]];
        NSArray *res=[self.context executeFetchRequest:fr error:nil];
        NSLog(@"fetched city name: %@", ((CDCities *)[res objectAtIndex:0]).name);

上下文更新后: 获取属性city是nil(我认为这是因为它仍然指向已删除的旧城区条目),但是如果我正在手动获取我正在获取新数据。

1 个答案:

答案 0 :(得分:1)

只需在配置单元格的位置明确调用已获取的属性。

[managedObject fetchedPropertyAttribute];

它应该按预期重新计算。

另外,请考虑使用关系而不是fetched属性。