0

我正在试验 AFIncrementalStore,这很棒,但我注意到我遇到了一些性能问题。

具体来说,我正在使用它从 facebook graph api 中删除一堆 facebook 朋友信息,并且我看到一些非常慢的时钟时间用于保存操作。对于上下文,我正在加载大约 900 条记录。Instruments 告诉我问题是这样的:

 NSManagedObjectID *backingObjectID = [self objectIDForBackingObjectForEntity:entity withResourceIdentifier:resourceIdentifier];

这反过来又称之为

[backingContext performBlockAndWait:^{
        backingObjectID = [[backingContext executeFetchRequest:fetchRequest error:&error] lastObject];
    }];

有没有人有使用 AFIncremental 存储更大数据集的经验?

我不太明白的其他一些事情是,为什么所有这些操作都发生在主线程上,而所有这些操作都使用performBlockAndWait来自具有 PrivateQueueConcurrencyType 的上下文中的操作启动。非常感谢任何帮助!

4

1 回答 1

0

只是部分答案:

performBlockAndWait:将在私有队列上执行块,但调用线程将“似乎等待”直到块完成。(注意“出现等待”,解释如下)。

队列是同步访问共享资源的底层机制。这确保可以同时访问共享资源。

现在,GCD 可以对选择用于驱动队列的线程进行优化:如果您同步调度, GCD可以选择使用驱动私有专用队列的当前线程。

注意:在特定队列中排队的块可以在任何线程上执行。尽管如此,“执行上下文”是队列——它决定了同步。

因此,换句话说performBlockAndWait:,它看起来好像会被同步调用。如果块将在同一个线程上执行,则该线程不会阻塞。它只是在执行块时切换到私有队列(从而保证共享访问)。这是有道理的,因为消息的名称表明:“..AndWait”。

于 2013-08-13T07:09:43.993 回答