在我们的应用程序中,我们在表视图中使用核心数据和nsfetchedesultscontroller。我们的一些实体可以包含多达50k个条目,这些条目与nsfetchedesultscontroller和表视图相关联。
我的问题是我有一些后台查询在该实体上执行提取(可能需要3秒以上),同时nsfetchedesultscontroller尝试在同一实体上执行提取以填充表视图。
现在,如果其中一个bg查询正在运行,则表格视图滚动速度会变慢。另一方面,如果我不断滚动,那么bg查询不会运行直到我已停止滚动,并且可能是nsfetchedesultscontroller已停止访问实体/文件系统?
所有bg查询都使用自己的NSPrivateQueueConcurrencyType上下文在执行块中运行
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
[operation addExecutionBlock:^{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setUndoManager:nil];
[context setPersistentStoreCoordinator:[RootUtility getPersistentStoreCoordinator]];
[context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:context];
// perform long running query
}];
答案 0 :(得分:0)
我经历过同样的事情。并发提取之间似乎存在瓶颈,只要它们是使用主持久性存储协调器进行的。我的解决方案是使用这篇文章:
并在仅共享NSPersistentStore的后台线程上创建单独的核心数据堆栈。这样,此背景堆栈上的长读取不会阻止主线程。