gpt4 book ai didi

ios - ReactiveCocoa 如何监听数据模型属性的变化

转载 作者:行者123 更新时间:2023-11-28 14:57:14 25 4
gpt4 key购买 nike

这里是 ReactiveCocoa 的新手。我有一个 (MVVM) View 模型,代表一个类似新闻源的页面,什么是监听数据模型属性变化的正确方法?在下面的示例中,startUpdate() 不断更新 post。计算属性 messageToDisplayshouldShowHeart 驱动一些 UI 事件。

struct Post {
var iLiked: Bool
var likes: Int
...
}

class PostViewModel: NSObject {
private var post: Post

var messageToDisplay: String {
if post.iLiked { return ... }
else { return .... }
}

var shouldShowHeart: Bool {
return iLiked && likes > 10
}

func startUpdate() {
// network request and update post
}
...
}

在我看来,为了让整个事情变得 react ,我必须听取 Post 的每个属性和所有计算属性?我觉得不太合适。

最佳答案

是的,你是对的 - 你将不得不听取 Post 的每个属性您想绑定(bind)到 UI,但这实际上没什么大不了的。

我建议你使用 ReactiveSwift Property并像这样替换计算属性:

final class PostViewModel {
private let post: MutableProperty<Post>

let messageToDisplay: Property<String>
let shouldShowHeart: Property<Bool>

func startUpdate() {
// network request and update post by setting self.post.value = newPost
}

init(post: Post) {
self.post = MutableProperty(post)
self.messageToDisplay = self.post.map {
if $0.iLiked { return "liked" }
else { return "not liked" }
}
self.shouldShowHeart = self.post.map {
$0.iLiked && $0.likes > 10
}
}
}

您唯一更改的是帖子(每次更新帖子),因此这是一个 MutableProperty , 但它是私有(private)的,只能由 PostViewModel 更改.

计算属性被 Property 取代(它们是只读的)并且由于它们从帖子中获取它们的值(value),因此它们是从帖子 MutableProperty 映射而来的

在您的 UI 中(我假设每个帖子都有一个 UITableViewCell),您可以像这样绑定(bind)这些属性:

class PostTableViewCell: UITableViewCell {
var message: UILabel!
var heartIcon: UIImageView!

func bind(post: PostViewModel) {
message.reactive.text <~ post.messageToDisplay
heartIcon.reactive.isHidden <~ post.shouldShowHeart.negate()
}
}

关于ios - ReactiveCocoa 如何监听数据模型属性的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215855/

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