NSFetchedResultsController未触发controllerDidChangeContent

时间:2015-01-06 07:21:46

标签: ios core-data restkit

我目前的设置:

我打算使用UISegmentedControl在我想要在tableview中显示的数据之间切换。 我一直在使用restkit进行webservice的所有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从不填充。

1 个答案:

答案 0 :(得分:3)

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

使用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];

在委托回调

时保持逻辑