- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
TL;DR - 为了简化整个描述,当核心数据对象属性在后台频繁更新时,如何着手实现一个非基于 TableView 的 View Controller UI。因此,视觉数据表示需要立即更新。 [在 tableview 中它很容易处理,您使用 FRC 并在对象更新时通过 FRC 委托(delegate)方法重新加载行。]
我知道 NSFetchedResultsController
并通过它映射到用户界面。但只有当用户界面基于列表时才会这样。
在我的例子中,多个类似类型的硬件通过蓝牙 (BLE) 连接到我的应用程序,每个硬件通常提供更新频率一般为 1 秒。例如温度、电荷变化。
下面是一个 UI 流程示例,
列表 -> 详细信息
详细信息
Details 仅代表硬件相关数据(序列号、固件版本、制造日期等),它有 3 个上面命名的按钮,当点击它们时会推送到相应的 Controller 。
实体模型也是相应地设计的,这里是一瞥,我有一个主要的实体让我们说 ABC
。然后 ABC
与其他实体如 HealthDetails
、Activity
、NotificationSetting
和 具有一对一的关系硬件详细信息
。 ABC
有一些属性,例如 identifier
、connected
、name
等。
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/
按照我目前安排代码的方式,下一行将为各种托管对象上下文运行。一些获取的实体将具有“complededDate”,而其他实体将没有“completedDate”属性。 let task = retrie
我在 import CoreData 的应用程序委托(delegate)中遇到此错误。据我所知,这是因为我将一个项目命名为 coreData。但是我更改了项目的名称,然后将其删除,并且删除了 /Lib
我想将记录保存在数组中并从 CoreData 中删除它们。我尝试过使用 NSCopying 但似乎 copyWithZone 不适用于 NSManagedObject。我真的很困惑,任何帮助将不胜感激
有时我的项目中很少会出现错误(比如每第 100 个请求)。我的一些 CoreData 的请求有 data:我无法使用该数据。我真的不明白为什么会发生这种情况以及如何防止这种行为。 错误数据输出示例:
如果您使用 Xcode 创建一个新项目并告诉它在您创建项目时创建一个 CoreData 模板,则您不需要 #import 在使用 ManagedObjects 的类中。 我已经将 Core Data
我对 SQLCipher 数据库加密和 CoreData 有疑问:当我将持久存储协调器与 SQLCipher 一起使用时,它总是在第一次应用程序重新启动后因一对多关系故障而崩溃。因此,当我第一次启动该
我有一个想要添加 iCloud 支持的应用程序。此应用程序从服务器加载数据,并将数据存储在 CoreData 中,以便 NSFetchedResultsController可以管理UITableVie
我正在从 coredata 表 STUDENT 中获取数据,并使用 Array 在 tableview 中显示所有学生姓名。在选择任何一个学生姓名后(点击 tableViewCell),它会从另一个表
我在构建过程中收到以下错误。 “API 滥用:尝试序列化非拥有协调器上的存储访问(PSC = 0x7fb5ae208890,存储 PSC = 0x0)CoreData 为什么我的应用程序会出现 Cor
当将 iOS 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 Ab
我的应用程序有两个选项卡栏...每个选项卡栏都将用户带到一个向他显示项目列表的 TableView Controller 。第一个 View 允许用户在数据库中记录条目。另一个选项卡/ View 从数
Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省
我有一个名为visitDate的coredata属性 我想使用单独的选择器相互独立地设置日期和时间。 我意识到,当我设置时间时,我需要获取visitDate的现有日期、月份和年份,但只从NSDateP
我有这个代码示例演示如何更新核心数据中的对象,但是我遇到了一个小问题: // Retrieve the context if (managedObjectContext == nil) { m
我在 CoreData 中有一个包含整数值的列。在从中检索结果时,我希望将列值减去一个数字。 类似于:columnValue - someNumber(此数字由用户输入) 我知道我可能必须为此使用 N
有没有办法将 CoreData 模型文件(即实体描述:*.xcdatamodeld)导出到另一个项目。因为重新创建所有实体很无聊:-) 最佳答案 是的,只需将模型文件本身添加/复制到新项目中,就像任何
我使用核心数据编写了 iPhone 应用程序。当我在模拟器中运行应用程序时,它崩溃并出现以下错误: 2010-02-12 17:24:22.359 CrData[46122:4503] Unresol
我是 CoreData 的新手,在我的 iPhone 应用程序中,我想知道如何保存一些文本,然后将其重新加载。但诀窍是,当 UIDatePicker 中的日期与我相同时加载它。像日历一样保存它。 更新
我正在寻找在 CoreData 中编写一些基本查询的方法,但文档中没有示例。以下是我的查询: 我有一个费用对象,它有一个费用金额字段。 费用可以链接到 ExpenseCategory 对象。 Expe
我在标题中使用“单例”一词时可能存在术语不正确的情况。我现在正在寻找一种好的技术。我有一个名为 user 的实体,它存储用户登录的数据,例如用于发出服务器请求的 session key 。我只希望这些
我是一名优秀的程序员,十分优秀!