J'essaie de mettre en œuvre la synchronisation avec CloudKit. Pour récupérer les modifications du serveur, j'utilise CKFetchRecordZoneChangesOperation. Cependant recordZoneChangeTokensUpdatedBlock n'est pas du tout appelé. Voici le code:

let options = CKFetchRecordZoneChangesOptions()
options.previousServerChangeToken = changesToken

let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [paletteZoneId], optionsByRecordZoneID: [paletteZoneId:options])
operation.fetchAllChanges = true

operation.recordChangedBlock = {(record) in
   ...
}

operation.recordWithIDWasDeletedBlock = { (recordId,str) in
    ...
}

operation.recordZoneChangeTokensUpdatedBlock = { recordZoneId, token, data in
    print("new token")
    self.changesToken = token
}


operation.fetchRecordZoneChangesCompletionBlock = { error in
    ...
}

privateDB.add(operation)

Donc, l'opération de résultat ne fonctionne pas correctement. Les autres blocs sont appelés comme prévu.

La documentation indique que le bloc de jetons doit être appelé par zone, mais il n'est pas du tout appelé.

J'apprécierais vraiment toute aide.

Merci beaucoup.

3
Nikita Gaidukov 16 janv. 2017 à 23:47

2 réponses

Meilleure réponse

Le jeton de changement de serveur est renvoyé dans un bloc différent - vous devez utiliser recordZoneFetchCompletionBlock.

4
Chris Deft 8 mars 2017 à 12:14

À partir du fichier d'en-tête CKFetchRecordZoneChangesOperation à propos de < recordZoneChangeTokensUpdatedBlock:

Les clients sont responsables de sauvegarder cette zone par enregistrement serverChangeToken et de la transmettre au prochain appel à CKFetchRecordZoneChangesOperation.

Notez qu'une extraction peut échouer à mi-chemin. Si cela se produit, un jeton de modification mis à jour peut être retourné dans ce bloc afin que les enregistrements déjà récupérés n'aient pas besoin d'être retéléchargés lors d'une opération ultérieure.

recordZoneChangeTokensUpdatedBlock ne sera pas appelé après le dernier lot de modifications dans une zone; le bloc recordZoneFetchCompletionBlock sera appelé à la place

Le clientChangeTokenData du plus récent CKModifyRecordsOperation émis sur cette zone est également renvoyé, ou nul si aucun n'a été fourni.

Si le serveur renvoie une erreur CKErrorChangeTokenExpired, le serverChangeToken utilisé pour cette zone d'enregistrement lors de l'initiation de cette opération était trop ancien et le client doit jeter son cache local et récupérer les modifications dans cette zone d'enregistrement en commençant par un nul serverChangeToken.

recordZoneChangeTokensUpdatedBlock ne sera pas appelé si fetchAllChanges est NON.

Obtenez la définition de la fonction pour la voir. (Faites un clic gauche et sélectionnez Aller à la définition sur recordZoneChangeTokensUpdatedBlock )

Donc pour le développeur, cela signifie que lors de l'énorme requête (1000 enregistrements par exemple) si une erreur survient, une nouvelle requête peut être lancée à partir du point où elle a été interrompue et seuls les autres éléments peuvent être téléchargés. En pratique, aujourd'hui, ce rappel est appelé à une énorme demande après chaque 200 éléments reçus, fournissant un nouveau jeton de changement. Ainsi, les éléments reçus avant qu'une erreur ne se produise peuvent être traités d'une manière ou d'une autre et la mise à jour peut être déclenchée plus tard à partir de ce point.

Enfin, la réponse est: ce bloc est appelé pour une énorme demande. Vous pouvez l'essayer en créant quelques centaines d'articles et les récupérer ensuite.

2
Community 20 juin 2020 à 09:12