从CloudKit资产中的CoreData受管对象保存NSData

时间:2016-01-25 10:23:58

标签: ios core-data cloudkit

我在CoreData托管对象中存储了一个小图像NSData,我需要将CloudKit记录保存为CKAsset

我希望简单地从托管对象中投射NSData,如下所示:

myCKRecord["document"] = myCDRecord.document as! CKAsset

不幸的是,这个演员表不起作用,所以我通过编写NSData的文件并使用该文件初始化CKAsset来进行解决方法。

class myManagedObject: NSManagedObject {

    @NSManaged var image: NSData?
    @NSManaged var name: String


func createCloudKitAsset(myCDRecord : myManagedObject) -> CKRecord

    let myCKRecordID = CKRecordID(recordName: myCDRecord.name)
    let myCKRecord = CKRecord(recordType: "myCKType", recordID: myCKRecordID)

    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let localURL =  NSURL.fileURLWithPath(dirPaths.first + "/" + recordName)
    let fileManager = NSFileManager.defaultManager()
    fileManager.createFileAtPath(localURL.path!, contents: myCDRecord.image, attributes: nil)

    myCKRecord["image"] = CKAsset(fileURL: localURL)
   ...
}

这样可行,但不整洁,在保存CK记录后我仍然要清理临时文件。

希望有人可以告诉我更好的方法。 感谢

1 个答案:

答案 0 :(得分:1)

将大型文档存储在Core Data中是不好的做法。 blob数据类型仅应用于缩略图等小图像。

相反,您的Core Data实体应该只通过您自己的目录方案和/或通过URL属性指向正确的文件。然后,您只需使用Core Data实体中的In [0]: os.path.abspath('c:/some/path') Out[0]: 'c:\\some\\path' 参数创建CKAsset。要访问数据,您可以使用fileURL的{​​{1}},这将是不同的。