在cocoa中保留数组控制器的内容和顺序

时间:2013-02-27 11:30:09

标签: objective-c core-data nsarraycontroller macruby

我有一个Mac OS应用程序,它使用核心数据将其对象保存到磁盘,由sqlite支持。

我有一个tableView,可以检查所有NSManagedObject子类。这绑定到一个arrayController,它绑定到managedObjectContext中的实体。

使用来自此arrayController的对象,我加载另一个arrayController,它支持另一个tableView,用于组织对象以准备导出到tsv文件。此tableView允许拖放以重新排序和删除条目 - 但这些都不会影响managedObjectContext。

将第二个arrayController的内容持久化到磁盘的最佳方法是什么,以便在重新打开文档时,tableView具有与以前相同的顺序的相同对象?

到目前为止,我设法编写的所有内容都是向managedObjects添加一个名为secondaryArrayOrder的属性,该属性在关闭文档时设置,或者如果从辅助arrayController中删除了一个对象,则设置为nil。虽然这会起作用,但它似乎是错误的方法。

编辑 - 添加了MacRuby代码,因为我现在使用该语言回答了我自己的问题。

1 个答案:

答案 0 :(得分:0)

我现在想出办法来做到这一点。

我在问题中没有提到该应用程序是MacRuby应用程序,因为它不相关,但我不相信我将我的解决方案完美地翻译成了Objective-C,所以我将它留作MacRuby。

每个NSManagedObject都有一个类NSManagedObjectID的objectID,它在应用程序中唯一标识它。因此,这些可以很容易地查询并作为plist文件中的字符串保存到磁盘,例如。

theObjects = arrayController.arrangedObjects
               .map { |e| e.objectID.URIRepresentation.absoluteString }

# save theObjects to disk as a plist or json.

这可用于在下次启动应用程序或打开文档时以相同的顺序重新创建阵列控制器的内容:

def loadArrayController(arrayOfIDStrings)
  objects = arrayOfIDStrings.map { |e|
    url = NSURL.URLWithString(e)
    moID = managedObjectContext.persistentStoreCoordinator.managedObjectIDForURIRepresentation(url)
    managedObjectContext.objectWithID(moID)
  }
  arrayController.addObjects(objects)
  arrayController.setSelectedObjects([])
end