首先,您需要存储CKServerChangeToken
由CKFetchNotificationChangesOperation
var notificationChangesOperation = CKFetchNotificationChangesOperation(previousServerChangeToken: previousChangeToken)
var fetchedRecordIDs:[CKRecordID]()
//we just care about inserts, we don't care about of changes of records existing in database, that's why it's enough just to save recordIDs
notificationChangesOperation.notificationChangedBlock = {notification in
let queryNotif = notification as CKQueryNotification
// println("fetched CKQueryNotification \(queryNotif)")
if (!contains(fetchedRecordIDs, queryNotif.recordID)) {
fetchedRecordIDs.append(queryNotif.recordID)
}
}
notificationChangesOperation.fetchNotificationChangesCompletionBlock = {serverChangeToken, error in
if (error) {
println("failed to fetch notification \(error)")
}
self.previousChangeToken = serverChangeToken
completionHandler(recordIDs: fetchedRecordIDs, error: error)
}
container.addOperation(notificationChangesOperation)
var previousChangeToken:CKServerChangeToken? {
get {
let encodedObjectData = NSUserDefaults.standardUserDefaults().objectForKey(SubscriptionKeys.PreviousChangeToken) as? NSData
if (encodedObjectData) {
return NSKeyedUnarchiver.unarchiveObjectWithData(encodedObjectData) as? CKServerChangeToken
}
return nil
}
set(newToken) {
if (newToken) {
println("new token \(newToken)")
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(newToken), forKey:SubscriptionKeys.PreviousChangeToken)
}
}
}
然后将其传递给CKFetchNotificationChangesOperation
. 然后,此操作将为您提供自上次请求以来的更新。CKNotification
( CKQueryNotification
) 为您提供CKRecordID
对象,而不是CKRecord
.
因此,您需要CKRecord
使用这些 ID 重新获取所有 s,CKFetchRecordsOperation
并相应地更新您的模型对象。
func queryMessagesWithIDs(IDs:[CKRecordID], completionHandler: ([CKRecord]!, NSError!) -> Void) {
var fetchRecordsOperation = CKFetchRecordsOperation(recordIDs: IDs)
var messages:[CKRecord]()
fetchRecordsOperation.perRecordCompletionBlock = {record, recordID, error in
if (!error) {
messages.append(record)
} else {
println("failed to get message with ID \(recordID.recordName)")
}
}
fetchRecordsOperation.fetchRecordsCompletionBlock = {_, error in
if (error) {
println(error)
} else {
messages.sort{$0.creationDate.compare($1.creationDate) == NSComparisonResult.OrderedAscending}
}
dispatch_async(dispatch_get_main_queue(), {completionHandler(messages, error)})
}
publicDatabase.addOperation(fetchRecordsOperation)
}