【问题标题】:NSURLConnection and NSFetchedResultsControllerNSURLConnection 和 NSFetchedResultsController
【发布时间】:2012-06-17 19:48:21
【问题描述】:

我正在努力让它发挥作用。

我查看了所有与 StackOverflow 相关的问题,但我无法完成最后一步!

我有一个 NSFetchedResultsController 显示来自 Core Data 的数据。这一切都完美无缺。当那里有数据时,它会显示数据,一切都很好。

但是,我有一个异步更新,它从在线服务器中提取更多数据并将其保存到 Core Data。

我想要发生的是NSFetchedResultsController 获取这些更新,然后显示它们(即将它们动画到当前显示的 tableView 上)。

我现在的设置是这样的......

感谢您对此的回复,我已经尝试过尝试使其正常工作,但我仍然没有看到“实时”更新。

我想我应该试着解释一下我现在在哪里。我在初始设置中发现了一些问题,现在我已经修复了这些问题,但仍然没有。

好的,那么首先是课程以及发生了什么......

[类 = AppDelegate]
[具有 managedObjectContext(主上下文)以及持久存储等...]
[方法=mergeChanges:通知 这使用 GCD 回到主线程并执行 mergeChangesWithObjectblahblah]

[类 = NetworkDataClass]
[这有自己的 ManagedObjectContext,在初始化时(在主线程中)创建]
[方法 = saveContext
1.添加AppDelegate作为bgContext的didsavenotification的观察者。
2. 保存上下文。
3. 删除 AppDelegate 作为观察者](我知道观察正在工作,因为我在 AppDelegate 中有一个断点,当它保存时会停止。)
[方法 = getDataFromOnline(不是实际名称,但您明白了要点)
1. GCD 到 bg 线程上。
2. 创建一个 NSURLRequest。
3. 同步运行请求。
4. 将数据放入类上下文中。
5.运行self saveContext]

[类 = tableViewClass]
【有tableView和NSFetchedResultsController也用NSFetchedResultsControllerDelegate】
[方法 = viewWillAppear
1. 在我的网络类单例中运行 getDataFromOnline 方法]

我在那里有一些默认数据以确保它被显示,当我进入 tableViewClass(上面详述)时,我可以以正确的排序顺序正确地查看数据,并带有正确的部分标题等......所以我可以清楚地看到 fetchedresultscontroller 正在工作。

我还可以看到(带有断点)它正确地触发了 getDataFromOnline 方法。我可以看到数据进来了,我可以看到它是通过我的 ManagedObject 子类添加的,这一切都发生在 bgthread 中。

我还可以看到,当它保存 AppDelegate 时,它​​正在正确运行它的 mergeChanges 函数。

我唯一看不到的是正在使用新数据更新的表格。

如果我 popToRootViewController 并返回到我的表,那么所有新数据都在那里,所以我知道合并已经完成,新数据已经添加和合并,但它只是在合并时没有出现。

我有什么遗漏吗?

我需要在桌子上运行 reloadData 吗?我是否需要从 fetchedresultscontroller 触发“重新获取”或其他内容?

现在真的很挣扎。

感谢您提供的任何(更多)帮助。

【问题讨论】:

  • 我相信NSFetchedResultsControllerDelegate方法实际上是更新监控需要实现的。另外 - 尝试使用视图控制器作为托管上下文通知的观察者。
  • 好的,抱歉再更新一次。我刚刚发现正在调用委托方法并且它们在主线程上。但是 tableView 仍然没有发生任何事情。可能需要进一步研究。
  • 啊!刚刚发现它(我认为) myTableView ivar 在通过委托方法时为零。嗯……
  • 这意味着当使用 tableView 时,它没有连接到 xib(如果它是 IBOutlet),或者如果它是以编程方式构建的,它根本没有被初始化。
  • 谢谢,但尝试将其作为属性,ivar 并且只是 viewWithTag:99 并且它总是为零?!将尝试删除并重新添加 tableView。谢谢

标签: ios core-data nsurlconnection nsfetchedresultscontroller nsmanagedobjectcontext


【解决方案1】:

我会尝试给你一些建议并重定向到一些好的链接。

首先,关于你的问题

我是否需要将 NSFetchedResultsController 添加到“监视” 合并?还是仅仅创建它就足以做到这一点?

您可以像 Eimantas 建议的那样简单地设置您用作代理的viewController NSFetchedResultsController。为此,您需要实现NSFetchedResultsControllerDelegate 类的方法。当上下文更新时,获取的控制器将自动响应更改。

观察者在哪里 NSManagedObjectContextObjectsDidChangeNotification 需要去吗?这是 可以在 AppDelegate 中(与 NSFetchedResultsController 在)。

在appDelegate中注册并合并更改是否可以。确保您注册的通知来自您的上下文并在主线程中执行。

我还需要添加其他观察者吗?

不,NSFetchedResultsControllerDelegate 很好。

我能做些什么来看看哪里出了问题? IE。 NSFetchedResultsControllerDelegate 是否应该运行我认为的任何方法 可以打断点吗?

首先,您可以查看核心数据通知是否包含您期望的对象。你可以简单地为它写一个日志。

我建议您阅读这个 SO 问题(由我编写)和 Jody Hagins 的相关答案。也许它会很有用。

NSFetchedResultsController doesn't show updates from a different context

如果可能的话,你能更好地解释一下你的意思是什么

我有一个 NSFetchedResultsController 显示来自 Core Data 的数据。这 一切正常。当那里有数据时,它会显示数据 一切都很好。

?

您是否在不同线程中执行 Core Data 插入?

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多