Core Data可以从sqlite支持的商店执行多次读取吗?

时间:2013-07-15 23:51:30

标签: ios uitableview core-data nsfetchedresultscontroller

在我们的应用程序中,我们在表视图中使用核心数据和nsfetchedesultscontroller。我们的一些实体可以包含多达50k个条目,这些条目与nsfetchedesultscontroller和表视图相关联。

我的问题是我有一些后台查询在该实体上执行提取(可能需要3秒以上),同时nsfetchedesultscontroller尝试在同一实体上执行提取以填充表视图。

现在,如果其中一个bg查询正在运行,则表格视图滚动速度会变慢。另一方面,如果我不断滚动,那么bg查询不会运行直到我已停止滚动,并且可能是nsfetchedesultscontroller已停止访问实体/文件系统?

  • 这是否意味着核心数据一次只能获得一个获取请求并按顺序处理所有读取请求?
  • Core Data在运行查询时是否锁定了sqlite db?
  • 有没有办法改善这个?

所有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 
}];

1 个答案:

答案 0 :(得分:0)

我经历过同样的事情。并发提取之间似乎存在瓶颈,只要它们是使用主持久性存储协调器进行的。我的解决方案是使用这篇文章:

Can multiple NSPersistentStoreCoordinator instances be connected to the same underlying SQLite persistent store?

并在仅共享NSPersistentStore的后台线程上创建单独的核心数据堆栈。这样,此背景堆栈上的长读取不会阻止主线程。