- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我在使用子上下文作为 NSPrivateQueueConcurrencyType 的便签本时遇到了问题。 我的核心数据栈是这样的: View Controller 使用主上下文。 Worker Con
在 AFNetworking 从我的应用服务器获取信息后,将调用以下方法来填充我的 Core-Data。 这些信息似乎工作得很好,因为当表格更新时,我可以看到 UITableView 中正在更新的新信
在 AFNetworking 从我的应用服务器获取信息后,将调用以下方法来填充我的 Core-Data。 这些信息似乎工作得很好,因为当表格更新时,我可以看到 UITableView 中正在更新的新信
这两天我一直在尝试让 Core Data 与多线程一起工作。我尝试使用 NSOperations 的标准线程限制方法、合并通知、使用 objectWithId、每个线程的上下文字典,但我仍然遇到奇怪的
我在 connectionDidFinishLoading:connection NSURLConnection 异步委托(delegate)方法中使用此代码,同时下载大量数据。 - (void)sa
我正在开发一个需要多次异步下载并将其内容保存到核心数据实体的应用程序。其中一个下载量很大,并且注意到在创建/写入托管对象上下文时 UI 被阻止。我的研究让我阅读了并发核心数据设置,并开始实现其中之一。
我正在使用 NSPrivateQueueConcurrencyType NSManagedObjectContext 并且在以下情况下会发生死锁。 在后台线程上,调用 performBlock: 。该
正如标题所说,问题是,如果一个 NSManagedObjectContext 并发类型 NSPrivateQueueConcurrencyType 是串行的还是并发的。 更具体地说,如果我调用 [ma
使用 NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 初始化的托管对象上下文连接到主队列和私有(private)队列,它们是串行队
我想知道 NSPrivateQueueConcurrencyType 上下文是否仅在 -performBlock 和 -performBlockAndWait 中运行。和从 NSPrivateQueu
我仍在为我的 RSS 阅读器编写代码,我已经到了这样的地步,我希望通过后台立即用最新的帖子填充我的 Feed 来让事情变得更顺畅。 问题是它使我的应用严重崩溃,并显示如下消息: 2013-10-02
我正在使用 NSPrivateQueueConcurrencyType 并发类型而不是 NSMainQueueConcurrencyType 遇到卡住(死锁?)。 我的上下文初始化: _managed
自 iOS 5 起,CoreData 引入了自己的私有(private)队列,您可以在其中让某些操作(特别是保存上下文)在后台运行。 这必须通过[context PerformBlock:...]完成
问题:当相关的 NSManaged 对象具有自定义 setter 时,使用后台线程获取托管对象不会正确延迟加载 NSManaged 对象关系。在具有主并发类型的主线程上执行提取没有问题。这是为什么?
我有一些现有的 Core Data 代码,它们使用 10.6 及更早版本的模式,在每个新线程中创建一个新的 NSManagedObjectContext,根据需要执行数据修改,保存 NSManaged
在 macOS 应用程序上,我有一个简单的 AddEditViewController,它从主视图 Controller 接收 NSManagedObject。然后,我创建一个子 NSManagedO
我是一名优秀的程序员,十分优秀!