2016-01-25 1 views
1

У меня есть небольшое изображение, сохраненное как NSData в управляемом объекте CoreData, которое необходимо сохранить в записи CloudKit как CKAsset.Сохранение NSData из управляемого объекта CoreData в объекте 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 сохраняется.

Надеюсь, кто-то может показать мне лучший способ сделать это. Thanks

ответ

1

Плохая практика хранения больших документов в Core Data. Тип данных blob должен использоваться только для небольших изображений, таких как миниатюры.

Вместо этого объект Core Data должен указывать на правильный файл либо через вашу собственную схему каталогов, либо через атрибут URL. Затем вам просто нужно создать CKAsset с параметром fileURL из объекта Core Data. Чтобы получить доступ к данным, вы должны использовать fileURLCKAsset, которые будут отличаться.

+0

Спасибо за предложение @Mundi. Просто указывать на файл из объекта CoreData может быть немного проще, поэтому я буду смотреть на это. Однако, я думаю, что основной вопрос все еще стоит. Если бы у меня был только небольшой двоичный объект, например. миниатюрное изображение), которое хранится как «NSData» в «CoreData», есть ли способ напрямую преобразовать эти данные в «CKAsset»? Или мне еще нужно написать файл, чтобы я мог инициализировать «CKAsset» с помощью файла fileURL? – djruss70

+0

Я отредактировал исходное сообщение, чтобы привести пример, который отражает правильное использование CoreData. – djruss70

+0

Ответ содержится в моем ответе: ** вам нужно создать 'CKAsset', используя URL-адрес файла, это единственный способ. – Mundi