在我们的应用程序中,我们在表格视图中使用核心数据和 nsfetchedesultscontroller。我们的一些实体中可以有多达 50k 个条目,这与绑定到 nsfetchedesultscontroller 和表视图的实体相同。
我的问题是我有一些后台查询在该实体上执行提取(可能需要 3+ 秒),同时 nsfetchedesultscontroller 试图在同一实体上执行提取以填充表视图。
现在,如果其中一个 bg 查询正在运行,则表视图滚动速度会变慢。另一方面,如果我不断滚动,那么 bg 查询不会运行,直到我停止滚动并且大概 nsfetchedesultscontroller 已经停止访问实体/文件系统?
- 这是否意味着核心数据一次只接受一个获取请求并按顺序处理所有读取请求?
- Core Data 在运行查询时是否锁定了 sqlite 数据库?
- 有什么办法可以改善这一点吗?
所有的 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
}];