У меня есть NSFetchedResultsController, который в основном обновляет UITableView со списком объектов, обновляемых в фоновом режиме. NSOperation создает / обновляет вызов API из веб-службы. Я реализовал различные методы NSFetchedResultsControllerDelegate (например, controllerWillChangeContent
, controller:didChangeObject:atIndexPath:forChangeType:newIndexPath
и т. Д.) С кодом с этого сайта: http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller
Проблема в том, что строка никогда не вставляется в UITableView, когда вставляется объект, соответствующий предикату. Однако когда я удаляю объект, который уже представлен в табличном представлении, соответствующая строка исчезает правильно.
Ниже приведен код для создания экземпляра NSFetchedResultsController:
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
// is a nearby category of objects - check to see if passed in
if (self.nearbyCat == nil) return nil;
// Creates a new NSManagedObjectContext
NSManagedObjectContext *moContext = [[Utils getUtils] newManagedObjectContext];
NSFetchRequest *req = [[NSFetchRequest alloc] init];
NSEntityDescription *nearbyObjDesc = [NSEntityDescription entityForName:ENTITY_NAME_OBJECT inManagedObjectContext:moContext];
[req setEntity:nearbyObjDesc];
// predicate key path is passed into the view controller is an ivar - fetchKeyPath
NSString *predKeyPath = self.fetchKeyPath;
NSString *catName = [self.nearbyCat valueForKey:kCategoryNameKey];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(%K like %@)",
predKeyPath, catName];
[req setPredicate:pred];
[predKeyPath release];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:kObjectScoreKey ascending:NO];
[req setSortDescriptors:[NSArray arrayWithObject:sort]];
[req setFetchBatchSize:20];
_cacheName = [[NSString alloc] initWithFormat:@"NearbyObjectsFor%@", catName];
// In case there are new objects created because of change in location,
// we delete from the cache first, keeping the cache fresh.
[NSFetchedResultsController deleteCacheWithName:_cacheName];
NSFetchedResultsController *myFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:req managedObjectContext:moContext sectionNameKeyPath:nil cacheName:_cacheName];
[moContext release];
self.fetchedResultsController = myFetchedResultsController;
_fetchedResultsController.delegate = self;
[sort release];
[req release];
[myFetchedResultsController release];
return _fetchedResultsController;
}
Я использую рекомендованный метод регистрации для NSManagedObjectContextDidSaveNotification, а затем выполняю mergeChangesFromContextDidSaveNotification: в главном потоке в методе mergeContextChanges ниже:
- (void)mergeContextChanges:(NSNotification *)note
{
if(note.object && self.fetchedResultsController)
{
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[[self.fetchedResultsController managedObjectContext] performSelectorOnMainThread:selector withObject:note waitUntilDone:YES];
}
}
Кто-нибудь сталкивался с подобной проблемой раньше?