我正在尝试AFIncrementalStore,这很棒,但我注意到我遇到了一些性能问题。
具体来说,我正在使用它从Facebook图形api中删除一堆facebook朋友信息,我看到一些相当慢的时钟用于保存操作。对于上下文,我加载了大约900条记录。仪器告诉我,问题在于:
NSManagedObjectID *backingObjectID = [self objectIDForBackingObjectForEntity:entity withResourceIdentifier:resourceIdentifier];
反过来调用此
[backingContext performBlockAndWait:^{
backingObjectID = [[backingContext executeFetchRequest:fetchRequest error:&error] lastObject];
}];
有没有人有使用AFIncremental商店和更大数据集的经验?
其他一些我不太明白为什么所有这些操作都发生在主线程上,当它使用来自具有PrivateQueueConcurrencyType的上下文的performBlockAndWait
操作开始时。任何帮助非常感谢!
答案 0 :(得分:0)
只是部分回答:
performBlockAndWait:
将在私有队列上执行该块,但调用线程将“出现等待”,直到该块完成。 (注意“出现等待”,如下所述)。
队列是用于同步对共享资源的访问的底层机制。这确保了可以同时访问共享资源。
现在,GCD可以应用有关选择用于驱动队列的线程的优化:如果您同步调度 GCD 可能选择使用驱动私有的当前线程专用队列。
注意:在特定队列上排队的块可以在任何线程上执行。尽管如此,“执行上下文”是队列 - 它决定了同步。
因此,换句话说,performBlockAndWait:
将显示为同步调用它。如果该块将在同一个线程上执行,则该线程不会阻塞。它只是在执行块时切换到专用队列(从而保证共享访问)。这是有道理的,因为消息的名称表示:“..AndWait”。