gpt4 book ai didi

ios - 如何在 coredata/NSManagedObject 模型数据更改与应用程序用户界面之间进行紧密耦合?

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:30 25 4
gpt4 key购买 nike

TL;DR - 为了简化整个描述,当核心数据对象属性在后台频繁更新时,如何着手实现一个非基于 TableView 的 View Controller UI。因此,视觉数据表示需要立即更新。 [在 tableview 中它很容易处理,您使用 FRC 并在对象更新时通过 FRC 委托(delegate)方法重新加载行。]


我知道 NSFetchedResultsController 并通过它映射到用户界面。但只有当用户界面基于列表时才会这样。

在我的例子中,多个类似类型的硬件通过蓝牙 (BLE) 连接到我的应用程序,每个硬件通常提供更新频率一般为 1 秒。例如温度、电荷变化。

下面是一个 UI 流程示例,

列表 -> 详细信息

详细信息

  1. 健康
  2. 事件
  3. 通知设置

Details 仅代表硬件相关数据(序列号、固件版本、制造日期等),它有 3 个上面命名的按钮,当点击它们时会推送到相应的 Controller 。

实体模型也是相应地设计的,这里是一瞥,我有一个主要的实体让我们说 ABC。然后 ABC 与其他实体如 HealthDetailsActivityNotificationSetting 具有一对一的关系硬件详细信息ABC 有一些属性,例如 identifierconnectedname 等。

ListViewController 是一个 UITableViewController,因此我使用的是 NSFetchedResultsController。现在剩下的所有其他 View Controller 都只是普通的 View Controller ,只有标题标签,如“上次收费日期”,它是静态的,下面有一个“描述标签”,显示数据。其他 View Controller 也类似地填充了按钮、标签等。

使用 NSFetchedResultsController 更新 ListView Controller 很容易。

[当用户点击行/单元格时,我只是使用来自 FRC 的索引路径获取对象并将其注入(inject)目标 View Controller 。]

但是其他 View Controller 不是基于 TableView 的。所以我使用通知来控制其他 View Controller UI 更新。

例如,当我的 BluetoothManager 从硬件接收到关于特征的更新时,我将特征 ID 和数据传送到我的 DatabaseHelper,然后它解码数据并插入到相应的托管对象中,此时我只是触发一个通知,其中包含已更新对象的标识符。

层次结构中位于导航堆栈中的所有 UIViewController 都被订阅为观察者。如果通知中的标识符与当前显示的实体对象相匹配,那么我会刷新 UI。目前一切正常。

但是,我觉得它很笨拙,要处理很多通知。这是将各个核心数据模型与 UI 紧密耦合的唯一方法,还是存在其他更好的方法?


我看到很少有评论建议仅通过 FRC 处理所有问题,但我不确定 FRC 是否可以用于非基于 TableView 的 UI 表示形式。我已经搜索过,但没有找到太多。如果有人知道任何教程/博客甚至是理论描述,那将是非常有帮助的。

关于 FRC 处理所有问题的另一件事,我没有完全理解,我需要为每个 View Controller 放置一个 FRC 吗?没有别的办法吗?

最佳答案

你不应该失去任何东西。 NSFetchedResultsController 上的委托(delegate)会在任何时候告诉您更新的内容。如果您有一个可见的 UI,那么您的 UI 将更新。如果您没有可见的 UI,或者不想要一个,您仍然可以将该 FRC 链接到您的特定 NSManagedObject 子类以获取健康详细信息,然后根据发生变化的事实采取任何适当的措施。

根据你在做什么,它可能就像实现 controllerDidChangeContent(_:)

一样简单

如果这不能解决您的问题,您将必须提供有关具体问题的更多详细信息。

关于ios - 如何在 coredata/NSManagedObject 模型数据更改与应用程序用户界面之间进行紧密耦合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37432731/

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