#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")!
Вот и все. Супер просто.