gpt4 book ai didi

ios - Realm 列表 KVO 观察

转载 作者:行者123 更新时间:2023-12-01 16:03:07 27 4
gpt4 key购买 nike

Realm Swift 文档指出,您在模型类上使用的大多数属性都可以使用 KVO 观察到。使用 ReactiveCocoa,对于我在模型类上的每个属性,我创建了一个可比较的 rac_发送值更改的前缀属性,然后我可以使用它来绑定(bind)到 MVVM 样式架构中的 View 。

示例模型类可能如下所示:

 class Post: Object {
dynamic var text = ""
private(set) lazy var rac_text: AnyProperty<String> = { [unowned self] in
return AnyProperty(initialValue: self.name, signal: self.rac_valuesForKeyPath("text", observer: self).toSignal().takeUntil(self.willDeallocSignal())
}()
}

这非常方便,因为 1) 从外部来看,它是不可变的( AnyPropertyMutableProperty 和 2) 只在模型使用 .takeUntil(self.willDeallocSignal()) 时存在。 . (我还想问,这里是否需要 [unowned self] 位?我不确定 self 是否被捕获,一直不擅长)。

问题来自 List特性。列表不能被标记为动态的,这是有道理的,它们的类型不能在objective-c中表示。关键值观察工作得很好,但有一个主要警告。

使用关系列表属性获取相同的类:
class Post: Object {
let users: List<User> = List<User>()
}

相应的 react 性观察属性应该类似于以下内容:
private(set) lazy var rac_users: AnyProperty<List<User>> = {
return AnyProperty(initialValue: self.users, signal: self.rac_valuesForKeyPath("users", observer: self).toSignal().takeUntil(self.willDeallocSignal()))
}()

然而,经过观察,信号不会发出 List对象,它会发出 RLMArray对象。我不得不 jerryrig 一个看起来像这样的信号发生器:
private(set) lazy var rac_posts: AnyProperty<List<Post>> = { [unowned self] in
return AnyProperty<List<Post>>(initialValue: self.posts, producer: self.rac_valuesForKeyPath("posts", observer: self)
.toSignalProducer()
.assumeNoErrors()
.map { $0 as! RLMArray }
.map { array in
var list = List<Post>()
for i in 0..<array.count {
if let element = array[i] as? Post {
list.append(element)
}
}
return list
})
}()

当然, if let语句总是失败,因为 RLMObject不能转换为 Post .所以我要么需要 a) 一种转换 RLMObject 的方法转至 Object s 或 b) 一种对发出列表的列表属性进行 kvo 的方法。我使用传统的 KVO 对其进行了测试,并得到了相同的结果。

最佳答案

您可以观察 List 类型的属性使用 Realm Swift 使用 addNotificationBlock .

此方法采用闭包,在 上调用每改变。至少只要您不阻止运行循环,通知可能会合并。初始值也通过这种机制报告,因此您可能会通过它获得额外的信号,这是您可能没有预料到的。

您应该能够将其与 Reactive Cocoa 连接起来,如下所示:

private(set) lazy var rac_posts: AnyProperty<List<Post>> = { [unowned self] in
return AnyProperty<List<Post>>(initialValue: self.posts, signal: Signal<List<Post>>() { [unowned self] observer in
let notificationToken = self.posts.addNotificationBlock { list in
observer.sendNext(list)
}

return ActionDisposable() {
notificationToken.stop()
}
}
}()

一次 #3359合并后,您还将获得细粒度的通知,通知您列表中的详细更改。

关于ios - Realm 列表 KVO 观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638546/

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