NSFetchedResultsController 没有触发 controllerDidChangeContent

NSFetchedResultsController not firing controllerDidChangeContent

我当前的设置:

我打算使用 UISegmentedControl 在我想在表格视图中显示的数据之间切换。 我一直在使用 restkit 进行所有 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);
    }

}

这就是我编写获取请求以传递到 fetchedresultscontroller 的方式。

-(NSFetchRequest *)prepareFetchRequestForGlobalAtm{

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

}

我已经在 segmentedControlToggledMethod 中适当地将它们配对在一起。

[self setupFetchedResultsControllerWithFetchRequest:[self prepareFetchRequestForGlobalAtm]];

//Restkit Call
[self loadGlobalAtms]; 

这是我的 NSFetchedResultsController 委托方法。

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

我的逻辑是,每个切换都应该根据已传递的值触发方法来设置 NSFetchedResultsController。我可以在日志中清楚地看到我有来自 web 服务的值并被缓存,但 tableview 永远不会自行填充。

您没有修改数据,所以收不到通知。

当你使用self.fetchedResultsController执行Fetch时,你已经获取了所有的对象。

当您在 mainManagedObjectContext 或其子 ManagedObjectContextinsert/update/delete 中 insert/update/delete 时,您可以收到委托的回调

你应该这样做

[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];

并保留委托回调时的逻辑