【问题标题】:Managing an NSManagedObject change between views管理视图之间的 NSManagedObject 更改
【发布时间】:2015-08-27 11:14:10
【问题描述】:

目前我正在通过Segues 将我的NSManagedObjects 传递给子视图。

我还没有对这些NSManagedObjects 中的任何一个进行更改,但我突然想到我可能会以错误的方式进行。

当我以这种方式对NSManagedObject 进行更改并将其保存回MOC 然后我返回到父视图 - 父视图的NSManagedObject 是否有这些更改或者我需要在每次加载视图时为MOC 创建一个新的fetchRequest

【问题讨论】:

  • 请不要在swift相关问题中添加objective-c标签
  • 我还建议通过 seques 传递相关的 NSManagedObject。是的,更改也将出现在父视图中,因为 NSManagedObject 在两个视图控制器中是相同的。但是您可能需要在父视图控制器中使用 KVO 检查对象的更改。
  • @Jasper 问题中没有任何与 swift 相关的内容。与 swift 相比,使用 ObjectiveC 的 Core Data 相关程序要多得多。因此,没有理由编辑原始海报放置的标签。
  • 你是对的,我的错。

标签: ios objective-c swift core-data


【解决方案1】:

如果您愿意,您可以传递该对象,因为您可以在需要时向它索取 MOC。

或者,您可以通过 MOC 本身。

如果视图共享相同的 MOC,那么是的,它们将看到相同的数据。

或者,您可以创建一个独立的 MOC,它会将任何更改与该 MOC 隔离,直到它被保存。然后,如果您选择保存到“详细 MOC”,这些更改可以以典型的 Core Data 方式合并,或者如果您的新 MOC 是子上下文,则更改将自动保存到父 MOC。

正如我在对之前帖子的评论中所说的那样。请不要将 managedObjectContext 填充到 App Delegate 中。是的,这就是 Apple 模板的工作原理。这是完全错误的。唯一的好处是它很简单。

但还是错了。

你说你做的是正确的做法。

【讨论】:

  • 出于兴趣,如何向对象索要其 moc?
  • @JodyHagins - 我也很高兴看到您的回答。我今天学到了一些东西!您能否提供有关导致使用 appDelegate 不正确的任何信息?我试图了解我以前使用过的那种方法的含义。谢谢!
  • @Charlie - 很多原因。然而,主要原因之一是单一职责原则。请参阅此链接:objectmentor.com/resources/articles/srp.pdf 另外,虽然我的堆栈与 Marcus 的有点不同,但这里有一篇关于如何处理核心数据堆栈的好论文:martiancraft.com/blog/2015/03/core-data-stack
  • @JodyHagins - 感谢您提供的信息!学习永无止境,哈哈。
【解决方案2】:

更新答案: 为了回应其他答案和以下的 cmets,我对这个主题做了更多的研究。我真的很困惑苹果文档让我相信这是正确的。我不确定为什么它不是真的正确,但似乎很多人认为它不是正确的方法。因此,我将发布此答案以供人们参考。这是一种行之有效的方式,但比我更了解该主题的人不喜欢它。

以我在 SO 上描述的方式找到许多参考来实现这一点令人困惑......这让我进一步相信这是做到这一点的方式。也许有人可以发布有关首选方法详细信息的有用链接?

原始答案:

我发现让视图控制器引用 appDelegate 来获取 NSManagedObject 和 NSManagedObjectContext 要容易得多。这可以防止您一遍又一遍地传递该信息,并确保您始终引用同一个 MOC。

为此,您需要在每个需要 MOC 的视图控制器上列出:

你可以这样做:

let appDel : AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

var moc = appDel.managedObjectContext!    

或者你可以说:

var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!

【讨论】:

  • 太棒了,我正在阅读...我已经在这样做了...但是当我想将对象传递给子视图时呢?此刻我正在这样做: managedObject = fetchedResultsController.objectAtIndexPath(indexPath) as? NSManagedObject 但我读过最好使用 id,那么如何在子视图中使用其 ID 检索该对象?
  • 您可以将对象的定义特征传递给下一个控制器,或者将该对象本身的实例传递给下一个控制器。假设您有一个具有名称、日期、时间的对象 [Place]。您可以将 MOC 的 fetchResult 保存到变量 aPlace 中:让 sortedFetchResults = moc.executeFetchRequest(sortedFetchRequest, error: nil) as! [地点] 你只需要确保你只得到一个对象。否则,你可以将你的“where”子句传递给下一个视图控制器,并让它使用 NSPredicate 向 MOC 询问对象本身。
  • 我更喜欢找到我感兴趣的一个对象,将其转换为正确的对象类型(var mocobject = as! Place),然后使用它传递给下一个视图控制器本身segueWithIdentifier: 并在 segue 之前设置下一个视图控制器类变量。
  • 我认为这就是我已经在做的事情,我的 segue 是这样的: if let destination = segue.destinationViewController as? JobViewController {destination.workItem = 发件人为?工作}并且在子控制器中我可以访问该工作对象,如果我对其进行更改并将其保存到moc,父母moc会更新吗?
  • 没有真正的方法来获取 MOC 中对象的 ID。没有分配和递增的默认 ID 以供参考。如果有帮助,这是我的 segue 内容的一个示例:在 prepareForSegue: if segue.identifier == "freqdetails" { let freqVC = segue.destinationViewController as! FreqTableVC freqVC.freqArr = freqArray //这是另一个控制器上的变量被设置为局部变量freqArray } }
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多