【发布时间】:2011-09-16 06:13:26
【问题描述】:
我有一个 NSFetchedResultsController,它基本上更新 UITableView,其中包含在后台更新的对象列表 NSOperation 实例化/更新了来自 Web 服务的 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 然后在下面的方法 mergeContextChanges 的主线程上执行 mergeChangesFromContextDidSaveNotification::
- (void)mergeContextChanges:(NSNotification *)note
{
if(note.object && self.fetchedResultsController)
{
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[[self.fetchedResultsController managedObjectContext] performSelectorOnMainThread:selector withObject:note waitUntilDone:YES];
}
}
以前有没有人遇到过类似的问题?
【问题讨论】:
-
你说:“问题是......当我删除一个对象......”那么你的问题是删除还是插入?
-
对不起应该更清楚。问题是当我插入表格视图时没有更新。
标签: objective-c ios uitableview core-data nsfetchedresultscontroller