Record Default Zone Private Database Default Zone Default Zone Record Custom Zone Default Zone Default Zone Record Shared Zone Shared Database Default Zone Default Zone Record
Record Default Zone Private Database Default Zone Default Zone Record Custom Zone Default Zone Default Zone Record Shared Zone Shared Database Default Zone Default Zone Record
Core Data's iCloud integration feature has been deprecated. Apps will continue to work. There are no changes to or removal of the functionality in macOS 10.12 and iOS 10. Historically, deprecated symbols in Cocoa remain functional for a considerable period of time before removal. Only the client side Core Data iCloud API symbols are deprecated. Core Data with iCloud is built on top of the iCloud Drive service. The service pieces are not effected in any way. If and when the deprecated APIs are disabled in some future OS version, applications running on iOS 9 or 10 will continue to work. IUUQTEFWFMPQFSBQQMFDPNMJCSBSZDPOUFOUSFMFBTFOPUFT(FOFSBM8IBU/FX$PSF%BUB3FMFBTF/PUFTIUNM
Core Data's iCloud integration feature has been deprecated. Apps will continue to work. There are no changes to or removal of the functionality in macOS 10.12 and iOS 10. Historically, deprecated symbols in Cocoa remain functional for a considerable period of time before removal. Only the client side Core Data iCloud API symbols are deprecated. Core Data with iCloud is built on top of the iCloud Drive service. The service pieces are not effected in any way. If and when the deprecated APIs are disabled in some future OS version, applications running on iOS 9 or 10 will continue to work. IUUQTEFWFMPQFSBQQMFDPNMJCSBSZDPOUFOUSFMFBTFOPUFT(FOFSBM8IBU/FX$PSF%BUB3FMFBTF/PUFTIUNM
[CKRecordID: CKRecord] = [:] var deletedRecordIDs = Set<CKRecordID>() let options = CKFetchRecordZoneChangesOptions() options.previousServerChangeToken = serverChangeToken let operation = CKFetchRecordZoneChangesOperation( recordZoneIDs: [recordZone.zoneID], optionsByRecordZoneID: [recordZone.zoneID : options] ) operation.recordChangedBlock = { record in changedRecords[record.recordID] = record } operation.recordWithIDWasDeletedBlock = { recordID, string in deletedRecordIDs.insert(recordID) changedRecords.removeValue(forKey: recordID) } operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // save token self.serverChangeToken = serverChangeToken } Assign serverChangeToken for getting the records from the previous point
== CKNotificationType.query { return } guard let queryNotification = notification as? CKQueryNotification else { return } guard let recordID = queryNotification.recordID else { return } switch queryNotification.queryNotificationReason { case .recordCreated: // check whether data is duplicate // save data to CoreData case .recordUpdated: // get the data from CoreData // save data to CoreData case .recordDeleted: // get the data from CoreData // delete data from CoreData }
== CKNotificationType.query { return } guard let queryNotification = notification as? CKQueryNotification else { return } guard let recordID = queryNotification.recordID else { return } switch queryNotification.queryNotificationReason { case .recordCreated: // check whether data is duplicate // save data to CoreData case .recordUpdated: // get the data from CoreData // save data to CoreData case .recordDeleted: // get the data from CoreData // delete data from CoreData } optional public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Swift.Void) •AppKit •UIKit optional public func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any])
• Categorize records for updating or creating • Use changedRecords variable • Update records to Core Data • Create records to Core Data • Finally save serverChangetoken Save server changes and token
[:] var deletedRecordIDs = Set<CKRecordID>() let options = CKFetchRecordZoneChangesOptions() options.previousServerChangeToken = serverChangeToken let operation = CKFetchRecordZoneChangesOperation( recordZoneIDs: [recordZone.zoneID], optionsByRecordZoneID: [recordZone.zoneID : options] ) operation.recordChangedBlock = { record in changedRecords[record.recordID] = record } operation.recordWithIDWasDeletedBlock = { recordID, string in deletedRecordIDs.insert(recordID) changedRecords.removeValue(forKey: recordID) } operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // save token self.serverChangeToken = serverChangeToken } Append the record or recordID Save server changes and token
[:] var deletedRecordIDs = Set<CKRecordID>() let options = CKFetchRecordZoneChangesOptions() options.previousServerChangeToken = serverChangeToken let operation = CKFetchRecordZoneChangesOperation( recordZoneIDs: [recordZone.zoneID], optionsByRecordZoneID: [recordZone.zoneID : options] ) operation.recordChangedBlock = { record in changedRecords[record.recordID] = record } operation.recordWithIDWasDeletedBlock = { recordID, string in deletedRecordIDs.insert(recordID) changedRecords.removeValue(forKey: recordID) } operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // save token self.serverChangeToken = serverChangeToken } • Delete records from Core Data • Use deletedRecordIDs variable • Categorize records for updating or creating • Use changedRecords variable • Update records to Core Data • Create records to Core Data • Finally save serverChangetoken Save server changes and token
[:] var deletedRecordIDs = Set<CKRecordID>() let options = CKFetchRecordZoneChangesOptions() options.previousServerChangeToken = serverChangeToken let operation = CKFetchRecordZoneChangesOperation( recordZoneIDs: [recordZone.zoneID], optionsByRecordZoneID: [recordZone.zoneID : options] ) operation.recordChangedBlock = { record in changedRecords[record.recordID] = record } operation.recordWithIDWasDeletedBlock = { recordID, string in deletedRecordIDs.insert(recordID) changedRecords.removeValue(forKey: recordID) } operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // save token self.serverChangeToken = serverChangeToken } • Delete records from Core Data • Use deletedRecordIDs variable • Categorize records for updating or creating • Use changedRecords variable • Update records to Core Data • Create records to Core Data • Finally save serverChangetoken Save server changes and token xxxxxxxxxxxxxxx
[:] var deletedRecordIDs = Set<CKRecordID>() let options = CKFetchRecordZoneChangesOptions() options.previousServerChangeToken = serverChangeToken let operation = CKFetchRecordZoneChangesOperation( recordZoneIDs: [recordZone.zoneID], optionsByRecordZoneID: [recordZone.zoneID : options] ) operation.recordChangedBlock = { record in changedRecords[record.recordID] = record } operation.recordWithIDWasDeletedBlock = { recordID, string in deletedRecordIDs.insert(recordID) changedRecords.removeValue(forKey: recordID) } operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // save token self.serverChangeToken = serverChangeToken } • Delete records from Core Data • Use deletedRecordIDs variable • Categorize records for updating or creating • Use changedRecords variable • Update records to Core Data • Create records to Core Data • Finally save serverChangetoken Send local changes Save server changes and token
[:] var deletedRecordIDs = Set<CKRecordID>() let options = CKFetchRecordZoneChangesOptions() options.previousServerChangeToken = serverChangeToken let operation = CKFetchRecordZoneChangesOperation( recordZoneIDs: [recordZone.zoneID], optionsByRecordZoneID: [recordZone.zoneID : options] ) operation.recordChangedBlock = { record in changedRecords[record.recordID] = record } operation.recordWithIDWasDeletedBlock = { recordID, string in deletedRecordIDs.insert(recordID) changedRecords.removeValue(forKey: recordID) } operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // save token self.serverChangeToken = serverChangeToken } • Delete records from Core Data • Use deletedRecordIDs variables • Categorize records for updating or creating • Use changedRecords variables • Update records to Core Data • Create records to Core Data • Finally save serverChangetoken Save server changes and token Send local changes
operation = CKModifyRecordsOperation( recordsToSave: nil, recordIDsToDelete: recordIDs ) operation.modifyRecordsCompletionBlock = { (records, recordIDs, error) in if let error = error { failure(error) return } // Delete Core Data } privateCloudDatabase.add(operation) • Delete records from Core Data and iCloud Server
lastSyncedTime) query.predicate = predicate items.forEach { note in if note.recordID != nil { note.update() } else { note.create() } } • Fetch records from Core Data • Save(create/update) records from iCloud server
(…snip…) operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // Delete Record self.sendDeletedRecord { // Fetch and save the records created and modified from the previous point self.sendRecordChanges { // Save the last synced time self.lastSyncedTime = Date() } } self.serverChangeToken = serverChangeToken } self.privateCloudDatabase.add(operation) Fetch/Save server changes
(…snip…) operation.recordZoneFetchCompletionBlock = { recordZoneID, serverChangeToken, data, result, error in (…snip…) // Delete Record self.sendDeletedRecord { // Fetch and save the records created and modified from the previous point self.sendRecordChanges { // Save the last synced time self.lastSyncedTime = Date() } } self.serverChangeToken = serverChangeToken } self.privateCloudDatabase.add(operation) Send local changes Fetch/Save server changes