gpt4 book ai didi

iphone - Core Data的NSPrivateQueueConcurrencyType以及线程间共享对象

转载 作者:行者123 更新时间:2023-12-03 18:14:12 26 4
gpt4 key购买 nike

iOS 5 引入了一种在后台线程上快速获取数据的新方法,方法是使用 NSPrivateQueueConcurrencyType 初始化 MOC,然后在 performBlock 中进行获取:

Core Data 的经验法则之一是不能在线程/队列之间共享托管对象。 performBlock: 仍然是这种情况吗?如下:

[context performBlock:^{
// fetch request code

NSArray *results = [context executeFetchRequest:request error:nil];

dispatch_async(dispatch_get_main_queue(), ^(void) {
Class *firstObject = [results objectAtIndex:0];
// do something with firstObject
});
}];

由于我在 bg 队列和主队列之间共享结果数组/对象,仍然 Not Acceptable ?我还需要使用托管对象 ID 来执行此操作吗?

最佳答案

当您使用NSPrivateQueueConcurrencyType时,您需要执行任何触及该上下文内属于该上下文的任何对象的操作- PerformBlock:方法。

上面的代码是非法的,因为您将这些对象传递回主队列。不过,新的 API 可以帮助您解决这个问题:您创建一个与主队列关联的上下文,即使用 NSMainQueueConcurrencyType:

// Assume we have these two context (They need to be set up. Assume they are.)
NSManagedObjectContext *mainMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
NSManagedObjectContext *backgroundMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];

// Now this can safely be called from ANY thread:
[backgroundMOC performBlock:^{
NSArray *results = [backgroundMOC executeFetchRequest:request error:nil];
for (NSManagedObject *mo in results) {
NSManagedObjectID *moid = [mo objectID];
[mainMOC performBlock:^{
NSManagedObject *mainMO = [mainMOC objectWithID:moid];
// Do stuff with 'mainMO'. Be careful NOT to use 'mo'.
}];
}
}];

如果将内部 [mainMOC PerformBlock:] 调用移至其自己的方法中,这会减少困惑。您可能还希望将对象 ID 数组传递回主线程上下文,而不是为每个对象 ID 执行一个 block 。这取决于您的需求。

关于iphone - Core Data的NSPrivateQueueConcurrencyType以及线程间共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com