1

数据绑定是一个很棒的抽象。我一直在 AngularJS 中使用它,它使应用程序变得更加简单。我正在尝试编写一个广泛使用数据绑定的 iOS 应用程序(在这种情况下是一个游戏),但 KVO 让我很伤心。哪个库为objective-c 实现了更好的数据绑定?具体来说,它应该:

  • 有弱引用,所以你不必重写 dealloc
  • 延迟触发绑定:如果您在函数中多次设置属性,它会触发一次
  • 延迟触发绑定:如果您在一个函数中设置了多个绑定属性,它会等到所有属性都设置完毕后再触发任何绑定(因此顺序无关紧要)
  • 更好的语法:不要把所有的观察者粘在一起(需要一个大的 if-else)
  • 更好的语法:使用块?
4

2 回答 2

3

Reactive Cocoa 看起来很棒:https ://github.com/blog/1107-reactivecocoa-for-a-better-world

我还没有尝试足够的方法来判断它是否满足#2和#3,但我希望如此。

于 2013-05-24T19:50:26.677 回答
0

看看https://github.com/mutech/aka-ios-beacon

Re (#1),你使用它很像 XAML 或 HTML 绑定。绑定表达式是在 Interface Builder 中使用可检查属性定义的(您可以在代码中执行此操作,但恕我直言,它违背了 MVVM 的大部分目的)。因此,无需设置或管理 KV 观测值,这已为您透明地(且可靠地)完成。

信标以绑定了解目标及其特定需求的方式扩展大多数视图。您不必担心更新频率。对于复杂的绑定(fe TableView 数据源),通常会延迟视觉更新,以使动画流畅并避免不必要的工作。同样,在大多数情况下,如果不是所有情况,这对您来说都是透明的。不确定这是否真的回答了#2和#3。

更好的语法:您可以通过在界面构建器属性中定义绑定表达式来设置绑定。例如,UILabel 文本绑定的简单绑定表达式可以是:

currentPerson.name

更复杂的绑定,也适用于标签可能如下所示:

account.amount { numberFormatter: { numberStyle: $enum.CurrencyStyle } }

表视图数据源的一个非常复杂的绑定闻起来像这样:

[
  arrayForFirstSection { headerTitle: "First Section" },
  fetchedResultsForSecondSection { headerTitle: "Second Section" }
] {
  cellMapping: { [ 
    { predicate: <MyModelClass1>, cellIdentifier: "Model1Cell" },
    { predicate: "SELF < $value" { value: 0 }, cellIdentifier: "NegativeNumberCell"}
  ] }
}

如果这看起来很吓人,请注意这就是链接表格视图所要做的一切。UITableViewDataSource 和 UITableViewDelegate 是通过绑定实现的。但是,您仍然可以提供委托方法并调整 tableview,几乎没有任何限制。

您的视图控制器只需提供您在视图的绑定表达式中引用的(键值编码兼容的)属性。

于 2016-03-13T17:06:05.747 回答