Ios NSFetchedResultsController未触发controllerDidChangeContent

Ios NSFetchedResultsController未触发controllerDidChangeContent,ios,core-data,restkit,Ios,Core Data,Restkit,我当前的设置: 我打算使用UISegmentedControl在我想在tableview中显示的数据之间切换。 我一直在使用restkit与Web服务进行所有restful交互。数据存储在coredata sqlite存储中。我已按以下方式设置了NSFetchedResultsController -(void)setupFetchedResultsControllerWithFetchRequest:(NSFetchRequest *)fetchRequest{ self.fetch

我当前的设置:

我打算使用UISegmentedControl在我想在tableview中显示的数据之间切换。 我一直在使用restkit与Web服务进行所有restful交互。数据存储在coredata sqlite存储中。我已按以下方式设置了NSFetchedResultsController

-(void)setupFetchedResultsControllerWithFetchRequest:(NSFetchRequest *)fetchRequest{

    self.fetchedResultsController=nil;

    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"address" ascending:YES];
    fetchRequest.sortDescriptors = @[descriptor];
    NSError *error = nil;
    // Setup fetched results
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                        managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];
    [self.fetchedResultsController setDelegate:self];
    BOOL fetchSuccessful = [self.fetchedResultsController performFetch:&error];
    // NSAssert([[self.fetchedResultsController fetchedObjects] count], @"Seeding didn't work...");
    if (! fetchSuccessful) {
        ShowAlertWithError(error);
    }

}
这就是我编写fetch请求以传递到fetchedresultscontroller的方式

-(NSFetchRequest *)prepareFetchRequestForGlobalAtm{

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"AtmBranches"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"branchType='0'"];
    [fetchRequest setPredicate:predicate];
    return fetchRequest;

}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.locationsTableView reloadData];
}
我已经在分段控制切换方法中将它们适当地匹配在一起

[self setupFetchedResultsControllerWithFetchRequest:[self prepareFetchRequestForGlobalAtm]];

//Restkit Call
[self loadGlobalAtms]; 
这是我对NSFetchedResultsController的委托方法

-(NSFetchRequest *)prepareFetchRequestForGlobalAtm{

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"AtmBranches"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"branchType='0'"];
    [fetchRequest setPredicate:predicate];
    return fetchRequest;

}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.locationsTableView reloadData];
}

我的逻辑是,每个切换都应该根据传递的值触发方法来设置NSFetchedResultsController。我可以在日志中清楚地看到,我有来自Web服务的值,这些值正在被缓存,但tableview从不填充自身。

您没有更改数据,因此无法接收通知

使用self.fetchedResultsController执行蚀刻时,您已经获得了所有对象

在mainManagedObjectContext或其子ManagedObjectContext中插入/更新/删除时,可以接收代理的回调

你应该这样做

[self.fetchedResultsController setDelegate:self];
BOOL fetchSuccessful = [self.fetchedResultsController performFetch:&error];
// NSAssert([[self.fetchedResultsController fetchedObjects] count], @"Seeding didn't work...");
if (! fetchSuccessful) {
    ShowAlertWithError(error);
}
[self.locationsTableView reloadData];

调用[self-loadGlobalAtms]后,如果要重新加载数据,请保留委托回调时的逻辑;您是否使用managedObjectContextyes存储数据?当然有。我可以使用sqlite浏览器工具查看sqlitedb中的对象。当您更改UISegmentedControl的值时,您将从本地核心数据加载数据,在performFetch之后,managedObjectContext中是否有任何对象?我想你的谓词可能有问题。我也遇到过同样的问题,它也是谓词。非常感谢!