【问题标题】:How to use committedValuesForKeys to save and reconstitute NSManagedObjects?如何使用committedValuesForKeys 保存和重构NSManagedObjects?
【发布时间】:2016-02-07 15:27:53
【问题描述】:

Nota Bene

如果需要更多信息,请在 cmets 中告知。

背景

仅使用 Apple API 我有兴趣将来自 NSManagedObject 或对象图的数据保存到文件中,以便我可以将其作为资产保存在 CloudKit 中,并通过公共数据库在用户之间共享。关于 SO 的几个问题解决了坚持 NSManagedObjects 的问题。没有人给出适合我用例的答案。

理论

我注意到 Apple 文档中的以下条目。由于这从 iOS 3.0 开始就可用,我想知道其他人是否使用过它,以及生成的字典是否可以成为保存我想通过网络发送的数据的合适解决方案。我的想法很简单,可以将字典存档或写入文件并以CKAsset 的形式上传。然后可以将下载的资产解压缩到字典中,该字典还应该允许人们为新的核心数据上下文重建新的NSManagedObject

调试代码

所以,我认为这当然是可能的,我直接跳进去开始使用字典。这段代码是为了帮助我理解在这样一个字典中可以期望的值的性质,以及如何使用这些值来重新创建一个新对象。

func debugEncodeObject () {
    if let aManagedObject = self.videoStory {
        if let uncodedObject = aManagedObject.committedValuesForKeys(nil) as? NSDictionary {


            for (key, value) in uncodedObject {
                print("key:\(key)\nvalue:\(value)\ndynamictype:\(value.dynamicType)\ndescription:\(value.description)")
            }
//            let tmpPath = NSTemporaryDirectory().NS.stringByAppendingPathComponent("MNG-\(NSUUID().UUIDString)")
//                print(tmpPath)
//                
//                if uncodedObject.writeToURL(NSURL(fileURLWithPath: tmpPath), atomically: true) {
//                    print(uncodedObject)
//                    MNGCloudManager.sharedInstance.insertSharedStoryRecord(uncodedObject)
//                    
//                }
        }
    }
}

并发症

所以查看我的检查代码的结果,我可以看到我的字典中有几个非标准条目。一些更有趣的结果显示了一些复杂性,这会稍微提高赌注。例如,查看存储在字典中的NSOrderedSet 的值会显示对象的内存中(指针?)表示,包括子对象的表示。我也确实看到了子对象的单独表示,所以我认为我应该能够使用现有数据重建新对象。

key:videos

value:Relationship 'videos' on managed object (0x1467b9750) <ths.VideoStory: 0x1467b9750> (entity: VideoStory; id: 0xd000000000380002 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/VideoStory/p14> ; data: {

    assetURL = nil;

    authoredBy = nil;

    collageImage = <ffd8ffe0 00104a46 49460001 01000000 00000000 ffe10080 45786966 00004d4d 002a0000 00080005 01120003 00000001 0001>;

    comments = Story;

    externalGUID = nil;

    externalURL = nil;

    lastModified = nil;

    location = nil;

    metadata = nil;

    ratingsArray = nil;

    sharable = 0;

    sharedWith =     (

    );

    summary = "A saga to tell. ";

    tagCount = 0;

    tagsArray = nil;

    timeStamp = "2015-12-24 19:29:46 +0000";

    title = Story;

    tokens =     (

    );

    videos =     (

        "0xd0000000006c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p27>",

        "0xd0000000004c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p19>"

    );

}) with objects {(

    <ths.Video: 0x1467ef540> (entity: Video; id: 0xd0000000006c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p27> ; data: {

    author = nil;

    comment = nil;

    location = nil;

    tagsArray = nil;

    thumbnail = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe1004c 45786966 00004d4d 002a0000 00080002 01120003 00000001 0001>;

    timeStamp = "2016-01-25 17:21:28 +0000";

    videoFile = "0xd0000000006c0006 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/VideoFile/p27>";

    videoStories = "<relationship fault: 0x1479305c0 'videoStories'>";

}),

    <ths.Video: 0x1467f63a0> (entity: Video; id: 0xd0000000004c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p19> ; data: <fault>)

)}

dynamictype:_NSFaultingMutableOrderedSet

description:Relationship 'videos' on managed object (0x1467b9750) <ths.VideoStory: 0x1467b9750> (entity: VideoStory; id: 0xd000000000380002 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/VideoStory/p14> ; data: {

    assetURL = nil;

    authoredBy = nil;

    collageImage = <ffd8ffe0 00104a46 49460001 01000000 00000000 ffe10080 45786966 00004d4d 002a0000 00080005 01120003 00000001 0001>;

    comments = Story;

    externalGUID = nil;

    externalURL = nil;

    lastModified = nil;

    location = nil;

    metadata = nil;

    ratingsArray = nil;

    sharable = 0;

    sharedWith =     (

    );

    summary = "A saga to tell. ";

    tagCount = 0;

    tagsArray = nil;

    timeStamp = "2015-12-24 19:29:46 +0000";

    title = Story;

    tokens =     (

    );

    videos =     (

        "0xd0000000006c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p27>",

        "0xd0000000004c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p19>"

    );

}) with objects {(

    <ths.Video: 0x1467ef540> (entity: Video; id: 0xd0000000006c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p27> ; data: {

    author = nil;

    comment = nil;

    location = nil;

    tagsArray = nil;

    thumbnail = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe1004c 45786966 00004d4d 002a0000 00080002 01120003 00000001 0001>;

    timeStamp = "2016-01-25 17:21:28 +0000";

    videoFile = "0xd0000000006c0006 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/VideoFile/p27>";

    videoStories = "<relationship fault: 0x1479305c0 'videoStories'>";

}),

    <ths.Video: 0x1467f63a0> (entity: Video; id: 0xd0000000004c0004 <x-coredata://C26A39CE-7016-48EE-9228-9B6B39E94BFB/Video/p19> ; data: <fault>)

)}

问题

在重新发明轮子之前,我是否遗漏了一些关于这本词典的性质和预期用途的明显内容?就像一个内置的 API 可以做我想做的事情(使用字典来构建一个匹配的新托管对象图并将其插入到不同手机上的不同上下文中)?另外,这本字典中的值是NSValues 吗?如果是这样,我可能需要将它们作为对象存储在新字典中。 Apple 提供此信息以轻松将 NSManagedObjects 拆分为 NSDictionary。我是否缺少执行相反操作的功能?

其他想法

我知道NSManagedObjects 最初设计为仅存在于上下文中。然而,API 方法自 iOS 3.0 以来一直存在,因此人们认为它有一些有用的目的。我需要创建尽可能保守的内存使用操作。有这方面经验的人能否分享这种方法的担忧或提出替代方案?

【问题讨论】:

    标签: swift core-data nsmanagedobject cloudkit


    【解决方案1】:

    使用 KVC。

    NSManagedObject 的属性,使用:

    NSArray *keys = [[[object entity] attributesByName] allKeys];
    NSDictionary *dictionary = [object dictionaryWithValuesForKeys:keys];
    

    生成的字典将具有模型中定义的标准类型的值。将此类字典中的值恢复为实例化的NSManagedObject

    [object setValuesForKeysWithDictionary:dictionary];
    

    对于关系有relationshipsByName。通过调用dictionaryWithValuesForKeys:,您将获得字典,其值为NSManagedObject 类型的一对一,并且根据您的模型,对多关系的有序或无序集合,每个包含NSManagedObjects。您必须对它们进行迭代并同样获取其属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多