为啥 MPMediaEntity / MPMediaItem 使用 valueForProperty?

Posted

技术标签:

【中文标题】为啥 MPMediaEntity / MPMediaItem 使用 valueForProperty?【英文标题】:Why does MPMediaEntity / MPMediaItem use valueForProperty?为什么 MPMediaEntity / MPMediaItem 使用 valueForProperty? 【发布时间】:2014-05-29 03:26:37 【问题描述】:

docs for MPMediaEntity(以及 MPMediaItem)解释说,要访问属性,您必须使用 valueForProperty:,然后它定义了一个将返回属性的 list of keys。我很好奇为什么必须以这种方式查询此元数据。为什么 MPMediaEntity 不简单地公开对象属性或 getter?

例子:

NSString* title = (NSString*)[item valueForProperty:MPMediaItemPropertyTitle];

为什么不这样:

NSString* title = item.title

【问题讨论】:

【参考方案1】:

除了MPMediaEntity 之外,这种模式还用于少数情况。一个例子包括NSURL(使用getResourceValue:forKey:error:

这种模式最可能的原因是因为有太多可能的值,并且随着时间的推移会出现新值。通过使用一种方法(以及不断增长的键列表),界面更加简洁。否则,该类将具有数十个属性,并且每次添加新值时类接口都会发生变化。

它还可以更轻松地实现其他一些方法,例如 enumerateValuesForProperties:usingBlock:canFilterByProperty:,因为您只需提供代表值的键。如果该类的每个值都有普通的旧属性,那么实现这样的方法会更加困难。

【讨论】:

太棒了。我认为创建一个方便访问的类别不会有任何害处:github.com/hodgesmr/MPMediaItem-Accessors【参考方案2】:

在当前的 SDK 中,Apple 为您定义了类型安全的 getter。

【讨论】:

以上是关于为啥 MPMediaEntity / MPMediaItem 使用 valueForProperty?的主要内容,如果未能解决你的问题,请参考以下文章

尝试跨启动持久化 MPMediaItem

你应该同步运行方法吗?为啥或者为啥不?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?