Синхронизация файлов в каталоге документов на разных устройствах

#swift #core-data #cloudkit

#swift #core-data #cloudkit

Вопрос:

Я добавил возможность добавления изображений к существующему, который использует CoreData и CloudKit для сохранения и синхронизации данных на разных устройствах. Поскольку изображения имеют большой размер, я сохраняю изображения в каталоге documents и сохраняю имя файла в CoreData.

 // "imgData" is the jpeg data of the image 


// create a unique name for the file
let date1 = String( Date.timeIntervalSinceReferenceDate )
let imageName = date1.replacingOccurrences(of: ".", with: "-")   ".jpeg"

// get the path to the documents directory
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!


do {
    let filePath = path.appendingPathComponent(imageName)
    try imgData.write(to: filePath) // save image data to documents directory

} catch {
   ......
}


// then I store the "imageName" to CoreData
let newRecord = EntityName(context: moc)
newRecord.imgName = imageName
.....

do {
    try self.moc.save()
} catch {
    print(error)
}
  

Затем я использую следующий код для отображения изображений (в SwiftUI) из имени сохраненного изображения.

 Image(uiImage: UIImage(contentsOfFile: path.appendingPathComponent(entityName.imgName!).path) ?? UIImage())
  

Приложение может получить все данные (включая имена файлов изображений) из iCloud, когда я удаляю и переустанавливаю приложение или когда я устанавливаю приложение на другое устройство.
Но все данные изображения исчезли.

Итак, как я могу синхронизировать все файлы в каталоге документов на разных устройствах, например, CloudKit синхронизирует данные на разных устройствах.

Ответ №1:

Решение заключается в сохранении изображений на диске iCloud.

Следуйте инструкциям этой статьи

затем (после выполнения инструкций, приведенных в приведенной выше статье) измените путь к каталогу документов, заменив это

// получить путь к каталогу документов
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

с помощью этого let path = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")!

Вот и все. Супер просто.