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];
并保留委托回调时的逻辑
我当前的设置:
我打算使用 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];
并保留委托回调时的逻辑