带有 Swift 和 iOS 8+ 的 CoreData 仍然需要 willAccessValueForKey() 吗?

Posted

技术标签:

【中文标题】带有 Swift 和 iOS 8+ 的 CoreData 仍然需要 willAccessValueForKey() 吗?【英文标题】:CoreData with Swift and iOS 8+ still needs willAccessValueForKey()? 【发布时间】:2017-03-06 09:28:48 【问题描述】:

我正在我的 NSManagedObject 子类中编写一个名为 Friend 的函数。

我想知道我是否应该写这个(用户是另一个NSManagedObject 用户):

  func firstCharacterOfComputerDisplayName() -> String
  
    guard let user = self.friend else 
      return ""
    
    return user.firstCharacterOfComputerDisplayName()
  

或者那个:

  func firstCharacterOfComputerDisplayName() -> String
  
    self.willAccessValue(forKey: "friend")

    guard let user = self.primitiveValueForKey("friend") as? User else 
      self.didAccessValue(forKey: "friend")
      return ""
    
    let dispName = user.firstCharacterOfComputerDisplayName()
    self.didAccessValue(forKey: "friend")
    return dispName
  

【问题讨论】:

【参考方案1】:

是否使用willAccessValue(forKey:)primitiveValueForKey(_:)didAccessValue(forKey:) 与您使用的是 Swift 还是 ios 8 无关。这严格来说是 Core Data 的事情。 Core Data 使用 KVO 来维护数据图的完整性等,所以它对何时观察到变化和访问有一定的期望。

大多数情况下你不需要关心这些方法,除非你重写了一个访问器方法。如果您想要self.friend 的值,只需将其作为self.friend 索取即可。除非您要覆盖 friend 的访问器,除非您在这里没有这样做。

【讨论】:

我已经阅读了很多文档和教程 + 最近来自苹果的 iOS 演讲,我感到很困惑。我想在我的具体情况下,第一个解决方案在这里起到了作用,因为朋友已经是由 coredata 管理的访问器。

以上是关于带有 Swift 和 iOS 8+ 的 CoreData 仍然需要 willAccessValueForKey() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Rpush gem 的 IOS/SWIFT 推送通知:生产中的无效令牌 (8)

如何使用Swift在iOS 8上显示带有文本的活动指示器?

使用 nib 自定义单元格和自动布局滚动跳转(ios 8 swift - UITableview)

iOS:UIView 的 Autolayout 拉伸高度过多(Xcode 8、Swift 3)

Swift 3 - 表 VC(使用 coredata)和细节 VC 的故事板设计 *从默认信息的细节 VC 开始*

Swift 3 iOS 10 - 带有图像和文本的 UICollectionView 无法正确显示