Ios 如何在coredata/NSManagedObject模型数据更改与应用程序用户界面之间实现紧密耦合?

Ios 如何在coredata/NSManagedObject模型数据更改与应用程序用户界面之间实现紧密耦合?,ios,swift,core-data,nsfetchedresultscontroller,Ios,Swift,Core Data,Nsfetchedresultscontroller,TL;DR-为了简化整个描述,当核心数据对象属性在后台频繁更新时,如何实现基于非tableview的视图控制器UI。因此,需要立即更新可视化数据表示。[在tableview中,很容易处理,您可以使用FRC,并在对象更新时通过FRCs委托方法重新加载行。] 我知道有关NSFetchedResultsController的以及通过它映射到用户界面的信息。但是,只有当用户界面是基于列表的时,才需要这样做 在我的情况下,多个类似类型的硬件通过蓝牙(BLE)连接到我的应用程序,每个硬件通常提供1秒的更新

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


我知道有关NSFetchedResultsController的
以及通过它映射到用户界面的信息。但是,只有当用户界面是基于列表的时,才需要这样做

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

下面是一个UI流的示例

列表->详细信息

细节

  • 健康
  • 活动
  • 通知设置
  • “详细信息”仅表示与硬件相关的数据(序列号、固件版本、制造日期等),它有3个名为“详细信息”的按钮,当点击这些按钮时,会将其推送到相应的控制器

    实体模型也被相应地设计,这里是一个概览,我有一个主要的实体,比如说
    ABC
    。然后,
    ABC
    与其他实体(如
    HealthDetails
    Activity
    NotificationSetting
    硬件详细信息
    )建立一对一的关系
    ABC
    几乎没有像
    identifier
    connected
    name
    等属性

    ListViewController
    是一个
    UITableViewController
    ,因此我使用的是一个
    NSFetchedResultsController
    。现在剩下的所有其他视图控制器都是普通视图控制器,只有标题标签,如“上次充电日期”,它是静态的,下面有一个“说明标签”,显示数据。其他视图控制器也同样只使用按钮、标签等填充

    使用
    NSFetchedResultsController
    可以轻松更新列表视图控制器

    [当用户点击行/单元格时,我只是使用FRC中的indexpath获取对象,并将其注入到目标视图控制器。]

    但是,其他视图控制器不是基于表视图的。因此,我使用通知来控制其他视图控制器UI更新

    例如,当my
    BluetoothManager
    接收到来自硬件的有关特征的更新时,我将特征id和数据传送到my
    DatabaseHelper
    ,后者随后解码数据并插入相应的托管对象,在这一点上,我只是触发了一个通知,通知中包含更新的对象的标识符

    导航堆栈中层次结构中的所有
    UIViewController
    s都作为观察者订阅。如果通知中的标识符与当前显示的实体对象匹配,那么我将刷新UI。目前,所有这些都可以正常工作

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


    我看到很少有评论建议只处理整个FRC,但我不确定FRC是否可以用于非基于tableview的UI表示。我找过了,没找到多少。如果有人知道任何教程/博客,甚至理论上的描述,这将是很大的帮助


    另一件事是关于FRC处理所有问题的建议,我没有完全理解,我需要为每个视图控制器放置一个FRC吗?没有别的办法吗?

    你不应该失去任何东西。NSFetchedResultsController上的委托将在任何时候更新某些内容时告诉您。如果您有一个可见的UI,那么您的UI将更新。如果您没有可见的UI,或者不想要一个,您仍然可以将FRC链接到特定的NSManagedObject子类以获取运行状况详细信息,然后根据发生更改的事实采取任何适当的操作

    根据您所做的工作,它可能与实现
    controllerDidChangeContent(:)

    如果这还不能回答您的问题,您将不得不提供关于具体问题的更多详细信息。

    您提到了更改“ViewController”,因此我假设当您按照您在“列表>健康>活动>设置”中的评论推送时,这些都是
    UIViewController
    类,对吗?如果是这样,请在每个视图中实现
    视图将出现
    方法,并确保在其中执行所有UI初始化。通过这样做,您可以保证当pop发生时,将调用此方法并更新您的UI(b/c您现在在该方法中拥有执行更新的逻辑)。我以前在
    viewDidLoad
    中进行UI初始化,但遇到了与您现在遇到的相同的问题。在我的情况下,将其移动到
    视图将出现

    在此之后,如果您仍然无法在UI中看到正确的值,请将断点放在
    视图将出现的方法中,并检查模型中的数据。也许模型是不正确的——在这种情况下,也许您需要执行查询(搜索)来再次提取所需的内容。除非您使用的是父/子上下文,并且没有将子上下文更改提交给父上下文,否则这不应该是一个问题

    但我觉得它很笨拙,处理了很多通知。是 唯一的方法或任何更好的方法存在紧密结合 将单个核心数据模型提交给UIs

    老实说,我认为没有更好的模型,因为在其他视图中没有使用FRC。如果您不使用表视图来重新加载或获取新数据,那么您肯定不需要使用FRC(尽管我不会说您不应该这样做,因为我不能使用FRC)