我在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记录后我仍然要清理临时文件。
希望有人可以告诉我更好的方法。 感谢
答案 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}},这将是不同的。