我正在试验AFIncrementalStore,这是很棒的,但我注意到我有一些性能问题。
具体来说,我用它从facebook图形api中获取了一堆facebook好友的信息,而且我看到了一些保存操作的非常慢的时钟时间。就上下文而言,我正在加载大约900条记录。仪器告诉我问题是:
NSManagedObjectID *backingObjectID = [self objectIDForBackingObjectForEntity:entity withResourceIdentifier:resourceIdentifier];这反过来又被称为
[backingContext performBlockAndWait:^{
backingObjectID = [[backingContext executeFetchRequest:fetchRequest error:&error] lastObject];
}];有没有人有过使用大数据集的AFIncremental存储的经验?
另外,我不太明白为什么所有这些操作都发生在主线程上,而所有这些操作都是使用performBlockAndWait操作从PrivateQueueConcurrencyType上下文中启动的。任何帮助都非常感谢!
发布于 2013-08-13 07:09:43
只是部分回答:
performBlockAndWait:将在私有队列上执行该块,但是调用线程将“似乎要等待”,直到块完成。(请注意下面解释的“似乎等待”)。
队列是同步访问共享资源的底层机制。这确保可以同时访问共享资源。
现在,GCD可以应用关于选择用于驱动队列的线程的优化:如果您同步地分派,GCD可以选择使用当前线程来驱动专用队列。
注意:在特定队列上排队的块可以在任何线程上执行。尽管如此,“执行上下文”是队列,它决定了同步。
因此,换句话说,performBlockAndWait:将显示为将被同步调用。如果该块将在同一线程上执行,则此线程将不会阻塞。它只是在执行块时切换到私有队列(从而保证共享访问)。这是有意义的,因为消息的名称表示:"..AndWait“。
https://stackoverflow.com/questions/18200677
复制相似问题