我有一个NSFetchedResultsController
和一些操作更新通过管理在单独的线程对象NSOperationQueue
。
财务汇报局(其谓语)看起来是这样的:
- (NSFetchedResultsController*)fetchedResultsController
{
if(fetchedResultsController) return fetchedResultsController;
NSManagedObjectContext* mainContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Check" inManagedObjectContext:mainContext]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isSync == %@", [NSNumber numberWithBool:NO]]];
[fetchRequest setFetchBatchSize:10];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil];
fetchedResultsController.delegate = self;
[fetchRequest release], fetchRequest = nil;
return fetchedResultsController;
}
主线程和线程操作有自己的管理对象上下文。 他们只共享相同的协调员。
内螺纹操作我的改变isSync
属性从NO
到YES
。 要知道什么是Check
实体更新,主要的背景下传递给螺纹一个NSManagedObjectID
。 螺纹操作检索类似下面的管理对象:
-(void)main
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] init];
[exportContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
//...
Check* check = (Check*)[exportContext existingObjectWithID:objID error:&error];
check.isSync = [NSNumber numberWithBool:YES];
//...
[exportContext save:&error];
[pool release], pool = nil;
}
当线程操作调用save
的mergeChangesFromContextDidSaveNotification
通知被调用,并在右键合并的变化。
- (void)contextChanged:(NSNotification*)notification
{
if ([notification object] == [self managedObjectContext]) return;
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES];
return;
}
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}
日志记录的说明notification
导致验证更改正确执行。
我的问题
的代表方法NSFetchedResultsControllerDelegate
不叫。
这是因为处理相同的上下文很奇怪,主要的一个,允许监听变化和委托方法被调用,例如删除的行对象UITableView
。
我发现在SO一些议题同样的问题。 我已经尝试了所有的解决方法,但我不能找到一个有价值的解决方案:
NSFetchedResultsController不显示来自其他上下文更新
从后台线程合并更新后NSFetchedResultsController不点火的委托方法
NSFetchedResultsController谓语忽略的变化,从不同的NSManagedObjectContext合并
先感谢您。
编辑
上面的代码是在以前的模式工作。 然后,我创建了从以前的一个新模式的复制(粘贴)的实体,现在它不工作了。
建议?
编辑2
这是我使用的谓词NSFetchedResultsController
吸气。 这是我的错,但是当我写的文章中,我并没有把它复制。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
// previous code here
[fetchRequest setSortDescriptors:sortDescriptors];
现在,关于乔迪最后的评论
在你的NSOperation的主要(),您正在加载新的对象,并在那里,它看起来像你的每一个新的对象设置isSync为YES。 您使用的fetchedResultsController谓词正在查找仅对具有isSync ==没有对象。
我希望,当属性isSync
设置为YES时, NSFetchedResultsController
指出,修改和删除,并非谓词匹配的行。 我错了吗?
请记住,合并从背景到主线程发生变化时,我能看到几个对象都更新了isSync
财产。