can you show some code?
I put together a barebones demo that goes through the same flow, with many shortcuts for brevity sake.
When I need to delete an ImageReference instance, I call the DataManager's deleteImage(_) method. When I do so, it falls through to the failure case of the CloudKitController's pushToICloud method.
// CloudObject
import Foundation
import CloudKit
class CloudObject: NSObject {
var properties: [String] = []
var className: String = ""
let cloudIdentifier = UUID().uuidString
func cloudRecord() -> CKRecord {
let recordID = CKRecord.ID(recordName: cloudIdentifier)
let record = CKRecord(recordType: className, recordID: recordID)
for property in properties {
let value = self.value(forKey: property)
record.setValue(value, forKey: property)
}
addAssetsToRecord(record)
return record
}
func addAssetsToRecord(_ record: CKRecord) {
// let subclasses use for adding assets or other content as needed
}
}
// ImageReference
import Foundation
import CloudKit
import UniformTypeIdentifiers
class ImageReference: CloudObject {
@objc var largeImage: Data?
@objc var thumbnailImage: Data?
private var largeImageURL: URL {
return ImageReference.imageFolderURL.appendingPathComponent(cloudIdentifier + "-large.jpg", conformingTo: .image)
}
private var thumbnailURL: URL {
return ImageReference.imageFolderURL.appendingPathComponent(cloudIdentifier + "-thumbnail.jpg", conformingTo: .image)
}
static let imageFolderURL: URL = URL.documentsDirectory.appendingPathComponent("Images", conformingTo: .folder)
override init() {
super.init()
className = "ImageReference"
properties.append(contentsOf: ["largeImage", "thumbnailImage"])
}
override func addAssetsToRecord(_ record: CKRecord) {
// add the image data as CKAssets
let largeAsset = CKAsset(fileURL: largeImageURL)
let thumbAsset = CKAsset(fileURL: thumbnailURL)
record.setObject(largeAsset, forKey: "largeImage")
record.setObject(thumbAsset, forKey: "thumbnailImage")
}
}
// DataManager
import Foundation
class DataManager {
var cloudKitController = CloudKitController()
func deleteImage(_ imageRef: ImageReference) async {
// delete the image reference from the local database...
// then:
imageRef.largeImage = nil
imageRef.thumbnailImage = nil
await cloudKitController.pushToICloud(object: imageRef)
}
}
// CloudKitController
import Foundation
import CloudKit
import os.log
class CloudKitController {
private var ckDatabase: CKDatabase
init() {
let container = CKContainer(identifier: "Demo Container Name")
ckDatabase = container.privateCloudDatabase
}
func pushToICloud(object: CloudObject) async {
// get a CKRecord for the object
let record = object.cloudRecord()
do {
let response = try await ckDatabase.modifyRecords(saving: [record], deleting: [], atomically: false)
let resultsDict = response.saveResults
for result in resultsDict {
switch result.value {
case .success(let record):
// call code that handles writing record to local DB
break // switch requires code execution of some sort, so for this demo...
case .failure(let error):
if let ckError = (error as? CKError) {
os_log("CK - CloudKit failure with error: \(ckError) in \(#function)")
}
}
}
} catch {
//handle the error
}
}
}```