Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何持久存储NSManagedObjectID?_Ios_Swift_Core Data_Persistence - Fatal编程技术网

Ios 如何持久存储NSManagedObjectID?

Ios 如何持久存储NSManagedObjectID?,ios,swift,core-data,persistence,Ios,Swift,Core Data,Persistence,为避免成为XY问题,以下是一些背景: 我的应用程序允许用户创建和保存很多设置,有点像Xcode的字体和颜色选择器: 这是因为用户可以设置很多东西。只需点击一个已保存的设置,而不是再次设置所有这些内容,会更容易 我使用核心数据来存储用户保存的设置。用户创建的每个设置都是NSManagedObject子类的一个实例。现在我需要持久地存储所选的设置,这样当应用程序重新打开时,用户将选择与以前相同的设置 我的第一个想法是将NSManagedObject子类实例存储在NSUserDefaults中。但根

为避免成为XY问题,以下是一些背景:

我的应用程序允许用户创建和保存很多设置,有点像Xcode的字体和颜色选择器:

这是因为用户可以设置很多东西。只需点击一个已保存的设置,而不是再次设置所有这些内容,会更容易

我使用核心数据来存储用户保存的设置。用户创建的每个设置都是
NSManagedObject
子类的一个实例。现在我需要持久地存储所选的设置,这样当应用程序重新打开时,用户将选择与以前相同的设置

我的第一个想法是将
NSManagedObject
子类实例存储在
NSUserDefaults
中。但根据文档,除非我将其转换为NSData,否则无法存储:

默认对象必须是属性列表,即NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的实例(或集合实例的组合)

然后我尝试存储
NSManagedObject
子类实例的
objectID
。我看到有一个
URIRepresentation()
方法返回一个
NSURL
。所以我认为这会起作用:

NSData(contentsOfURL: selectedOption!.objectID.URIRepresentation())
但是初始化器不知怎么失败了

现在我意识到这是一个愚蠢的想法,因为即使我可以将其转换为
NSData
,我也无法将
NSData
转换回
NSManagedObjectID

根据,OP似乎能够存储对象id:

我将所选主题objectID存储在NSUserDefaults中,这样当应用程序重新启动时,所选主题仍将保持不变


我该怎么做呢?

NSUserDefaults有“方便方法”

它允许存储和检索与获得的NSURL类似的
NSURL
通过
URIRepresentation()
。与NSData的转换 处理过程是透明的。从:

当使用
-[NSUserDefaults setURL:forKey://code>存储NSURL时,会进行一些调整:

  • 任何非文件URL都是通过调用
    +[NSKeyedArchiver archivedDataWithRootObject:][/code>将NSURL实例用作根来编写的
    反对
    
  • 当使用
    -[NSUserDefaults URLForKey:
    读取NSURL时,使用以下逻辑:

  • 如果键的值是NSData,则NSData将用作
    +[NSKeyedUnarchiver unarchiveObjectWithData:][/code>的参数。如果NSData可以作为NSURL未归档,则返回NSURL,否则返回nil
  • 因此,保存托管对象ID只需执行以下操作

    NSUserDefaults.standardUserDefaults().setURL(object.objectID.URIRepresentation(),
                                                 forKey: "selected")
    
    检索对象ID和对象,例如如下所示:

    if let url = NSUserDefaults.standardUserDefaults().URLForKey("selected"),
        let oid = context.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(url),
        let object = try? context.existingObjectWithID(oid) {
    
        print(object)
        // ...
    }
    

    有关保存所选设置的其他方法,请参阅。

    您只需将URIRepresentation的字符串值存储在NSUserDefaults中即可。稍后,您可以加载该字符串,然后使用
    managedobjectdforurirepresentation
    获取NSObjectId,然后使用
    objectWithID
    获取NSManagedObject@Paulw11那么如何将字符串转换为相应的NSManagedObject?正如我所说,通过提供指向
    managedObjectdForUrirPresentation
    的URL,以及在托管对象上下文上提供返回到
    objectWithID
    的对象I'd,为什么不在数据存储中存储一个标志以指示当前选择,或者一个与当前内容有关系的当前设置实体-你根本不需要使用对象ID…那么我如何才能将URL/NSData转换回NSManagedObject?@Paulw11已经在问题的评论中回答了这个问题谢谢。实际上我刚吃完晚饭回来。这就是为什么我回复得这么晚。:)
    if let url = NSUserDefaults.standardUserDefaults().URLForKey("selected"),
        let oid = context.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(url),
        let object = try? context.existingObjectWithID(oid) {
    
        print(object)
        // ...
    }