1

在我们的应用程序中,我们在表格视图中使用核心数据和 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 
}];
4

1 回答 1

0

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

多个 NSPersistentStoreCoordinator 实例可以连接到同一个底层 SQLite 持久存储吗?

并在仅共享 NSPersistentStore 的后台线程上创建单独的核心数据堆栈。这样,这个后台堆栈上的长取并没有阻塞主线程。

于 2013-12-08T23:32:48.893 回答