将 CoreData 托管对象的 NSData 保存在 CloudKit 资产中

Saving NSData from CoreData Managed Object in a CloudKit Asset

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

我希望像这样简单地从托管对象中转换 NSData

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

不幸的是,这个转换不起作用,所以我通过使用 NSData 编写一个文件并使用该文件初始化 CKAsset.[=19= 来解决这个问题]

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记录后需要清理的临时文件

希望有人能告诉我更好的方法。 谢谢

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

相反,您的 Core Data 实体应该通过您自己的目录方案指向正确的文件,and/or 通过 URL 属性。然后,您只需使用来自核心数据实体的 fileURL 参数创建 CKAsset。要访问数据,您将使用 CKAssetfileURL,这将有所不同。