gpt4 book ai didi

ios - 使用 NSPrivateQueueConcurrencyType 的具体/完整示例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:24 24 4
gpt4 key购买 nike

我仍在为我的 RSS 阅读器编写代码,我已经到了这样的地步,我希望通过后台立即用最新的帖子填充我的 Feed 来让事情变得更顺畅。

问题是它使我的应用严重崩溃,并显示如下消息:

2013-10-02 21:06:25.474 uRSS[97209:a0b] *** Terminating app due to uncaught 
exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource
must return a cell from tableView:cellForRowAtIndexPath:'

(堆栈跟踪)

我得出结论,我在这里运行的线程不安全,然后我发现了 this kind of CoreData snippets :

//Core Data's NSPrivateQueueConcurrencyType and sharing objects between threads
[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
});
}];

// 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 = [context 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'.
}];
}
}];

现在,我想知道的是:

  • 应该将 backgroundMOC 定义为类成员属性,还是每次调用使用它的方法时?
  • 如果此方法本身被异步调用(RSS 解析方法动态创建对象)怎么办?
  • 我如何安全地通知我的 UITAbleView 我的 MOC 已更新,以便它可以刷新而不会崩溃?
  • 这是否仅适用于提取,还是也适用于对象插入、删除等?
  • 我在哪里可以找到成功应用此概念的工作示例?

最佳答案

1) backgroundMOC 应该在你使用它的范围内定义。比如说,如果您在 SomeClass 中使用上下文,最好将其定义为 SomeClass 的属性。但是,通常许多类共享相同的上下文(例如,在所有 viewController 之间共享 mainMOC 是完全可以的)所以我建议定义 mainMOCbackgroundMOC 在您的 AppDelegate 或其他一些单例中。
2)没关系。然而,每次都创建上下文是个坏主意——参见 1 并在单例中初始化它们一次。
3)看看NSFetchedResultsController .这正是您设置 tableView 和跟踪 CoreData 更改所需要的。
4) 是
5)不能真正指向你工作的例子。在 developer.apple.com 上找到一些东西 =)

另外备注:
1) 你的类(class)不能命名为Class
2) 使用 existingObjectWithID:error:,而不是 objectWithID: — 检查 this回答,根据我的经验,这真的很烦人
3) 阅读 NSManagedObjectContext concurrency图案

关于ios - 使用 NSPrivateQueueConcurrencyType 的具体/完整示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151585/

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