ios - 从 CloudKit Assets 中的 CoreData 托管对象保存 NSData

标签 ios core-data cloudkit

我在 CoreData Managed Object 中有一个存储为 NSData 的小图像,我需要将其作为 CKAsset 保存在 CloudKit 记录中。

我希望像这样简单地从托管对象中转换 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记录后要清理的临时文件。

希望有人能告诉我一个更好的方法来做到这一点。 谢谢

最佳答案

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

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

关于ios - 从 CloudKit Assets 中的 CoreData 托管对象保存 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34990182/

相关文章:

ios - cloudKit:公共(public)数据库中的CKFetchRecordChangesOperation

ios - 如何使 TextField 右对齐(尾随)

ios - UICollectionViewCell 以编程方式自动布局

iOS在UIView上闪烁动画的次数有限

ios - 核心数据模型迁移

iphone - 我的Core Data代码有问题吗

ios - Core Data+CloudKit 未连接到 CloudKit

ios - 在输入第二个文本字段时使第二个文本字段清晰的 Swift 代码

ios - 如何在核心数据上实现 transient 属性?

ios - 如何判断您的应用程序是使用 iCloud 架构开发还是生产