【问题标题】:ReactiveCocoa how to listen to change in data model propertiesReactiveCocoa 如何监听数据模型属性的变化
【发布时间】:2018-03-11 01:51:21
【问题描述】:

这里是 ReactiveCocoa 的新手。我有一个(MVVM)视图模型,它代表一个类似新闻提要的页面,收听数据模型属性变化的正确方法是什么?在以下示例中,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
    }
    ...
}

在我看来,为了使整个事情具有反应性,我必须听取Post 的每个属性和所有计算属性?我觉得不太对劲。

【问题讨论】:

    标签: ios swift mvvm reactive-cocoa reactive-swift


    【解决方案1】:

    是的,你是对的——你必须监听你想要绑定到 UI 的 Post 的每个属性,但这实际上没什么大不了的。

    我建议你使用 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,但它是私有的,只能由 PostViewModel 更改。

    计算的属性被Property(只读)替换,因为它们的值来自帖子,所以它们是从帖子MutableProperty映射的

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

    class PostTableViewCell: UITableViewCell {
      var message: UILabel!
      var heartIcon: UIImageView!
    
      func bind(post: PostViewModel) {
        message.reactive.text <~ post.messageToDisplay
        heartIcon.reactive.isHidden <~ post.shouldShowHeart.negate()
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-16
      • 2020-06-15
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2023-02-08
      相关资源
      最近更新 更多