- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为ios构建一个应用程序来显示各种节日日常节目。在此应用程序中,我希望每次“添加”、“修改”或“删除”组成节日节目的事件之一时都会通知用户。
对于数据库,我正在使用 Realm 云服务。我的数据库的结构如下:我有一个名为“Festival”的 Realm 对象。在其中我有一个“DailyProgram”对象列表,在每个“DailyProgram”内部我有一个“Event”列表。我在下面提供了这些对象的片段。
当应用程序访问 Realm Cloud 时,它会下载一个包含所有不同节日的数组。
我想使用 Realm 内置通知系统来检测“事件”对象中的更改。
我尝试在此节日数组上实现集合通知,但是当我在数据库中对一个事件进行更改时,集合通知仅返回与发生更改的节日相对应的数组索引。我想获取有关发生更改的特定事件以及更改内容的信息。
class Festival: Object {
@objc dynamic var festivalId: String = UUID().uuidString
@objc dynamic var name: String = ""
@objc dynamic var town: String = ""
@objc dynamic var initialDate: Date = Date()
@objc dynamic var finalDate: Date = Date()
let program = List<DailyProgram>()
override static func primaryKey() -> String? {
return "festivalId"
}
}
class DailyProgram: Object{
@objc dynamic var day: Date = Date()
let events = List<Event>()
}
class Event: Object {
@objc dynamic var name: String = ""
@objc dynamic var local: String = ""
@objc dynamic var time: Date = Date()
}
我很清楚 Realm 中对象通知的存在。我认为这些可能是我的问题的解决方案。我知道如何在单个对象上实现对象通知。但是,我不知道如何在嵌套对象的情况下实现这些类型的通知。
最佳答案
简短的回答:
在事件和它所属的节日之间创建逆关系。然后根据属于特定节日的事件获取结果并观察它们。然后,当该节日添加、修改或删除任何事件时,您都会收到通知。
基于长代码的答案。从修改 Realm 对象开始(我删除了属性以缩短代码)
class Festival: Object {
@objc dynamic var festivalId: String = UUID().uuidString
@objc dynamic var name: String = ""
let program = List<DailyProgram>()
override static func primaryKey() -> String? {
return "festivalId"
}
}
class DailyProgram: Object {
@objc dynamic var day = ""
@objc dynamic var festival: Festival! //add this
let events = List<Event>()
}
class Event: Object {
@objc dynamic var daily_program: DailyProgram!
@objc dynamic var festival: Festival! //add this
@objc dynamic var name: String = ""
}
然后创建对象,确保添加逆关系。请注意 var 命名,f0 = Fest 0,f1 = Fest 1,然后 dp = DailyProgram 和 e = Event。这样做是为了更容易看到层次结构。
let f0 = Festival()
f0.name = "Fest 0"
let f0dp0 = DailyProgram()
f0dp0.day = "Monday"
f0dp0.festival = f0
let f0dp0e0 = Event()
f0dp0e0.name = "Morning event"
f0dp0e0.daily_program = f0dp0
f0dp0e0.festival = f0
let f0dp0e1 = Event()
f0dp0e1.name = "Afternoon event"
f0dp0e1.daily_program = f0dp0
f0dp0e1.festival = f0
let f1 = Festival()
f1.name = "Fest 1"
let f1dp0 = DailyProgram()
f1dp0.day = "Monday"
f1dp0.festival = f1
let f1dp0e0 = Event()
f1dp0e0.name = "Evening event"
f1dp0e0.daily_program = f1dp0
f1dp0e0.festival = f1
let f1dp0e1 = Event()
f1dp0e1.name = "Midnight event"
f1dp0e1.daily_program = f1dp0
f1dp0e1.festival = f1
上面创建了两个节日,每个节日都有一个周一的每日节目,然后每个周一的节目有两个事件。
然后我们加载结果并添加观察者。在本例中,我们对 Fest 1 事件感兴趣。
var eventResults: Results<Event>? = nil
var eventNotificationToken: NotificationToken? = nil
func loadAndObserveFestivalEvents() {
if let realm = gGetRealm() {
self.eventResults = realm.objects(Event.self).filter("festival.name == %@", "Fest 1")
self.observeEvents()
}
}
func observeEvents() {
self.eventNotificationToken = self.eventResults!.observe { (changes: RealmCollectionChange) in
switch changes {
case .initial:
print("initial event load complete")
if let results = self.eventResults { //just shows events are loaded
for e in results {
let d = e.daily_program.day
let f = e.festival.name
print(f, d, e.name)
}
}
break
case .update(_, let deletions, let insertions, let modifications):
print(" handle event delete, insert or mod")
if let results = self.eventResults { //shows the list including the newly added event
for e in results {
let d = e.daily_program.day
let f = e.festival.name
print(f, d, e.name)
}
}
break
case .error(let error):
fatalError("\(error)")
break
}
}
}
此时,我们已准备好将一个事件添加到 Fest 1 的星期一事件中,然后收到该事件已添加的通知。
func addEvent() {
if let realm = gGetRealm() {
let dp = realm.objects(DailyProgram.self).filter("festival.name == %@ && day == %@", "Fest 1", "Monday")
if let daily = dp.first {
let eventToAdd = Event()
eventToAdd.daily_program = daily
eventToAdd.festival = daily.festival
eventToAdd.name = "Super Duper Event"
try! realm.write {
daily.events.append(eventToAdd)
}
}
}
}
代码的最后一部分创建一个结果对象,该对象填充有 Fest 1(星期一)的 DailyProgram。
然后,我创建一个新事件,确保将其链接回 Fest 1 节日,然后将其添加到 DailyPrograms 事件列表中。
这段代码可以大大缩短,并且可以利用 LinkingObject 自动创建反向链接。然而,在这种情况下,一项事件将只属于一个 DailyProgram 和 Festival,因此实际上并不需要。
注意gGetRealm
是我用来连接到 Realm 的单例。
关于ios - 如何使用 Realm 通知来检测嵌套 Realm 对象的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57779619/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!