j'ai essayé d'utiliser NSCompoundPredicate(orPredicateWithSubpredicates:)
avec CloudKit
NSPredicate
mais je l'ai lu sur la documentation d'Apple qui OR
prédicats de comparaison ne sont pas pris en charge dans CloudKit
si je frappe une route-bloc avec cela.Utilisez CONTIENT ou ANY dans prédicat CloudKit avec un tableau de comparaison
J'ai un tableau de CKReferences
que je dois voir si un Record-type
de Reference list
contient les références.
Je me bats sur la façon d'assembler le prédicat lui-même, parce que j'essaie d'éviter les requêtes imbriquées dans le completionBlock
.
disons que je le tableau suivant des références:
let refs = [CKReference]() // in my case the array isn't empty
J'ai essayé ce qui suit, mais il n'a pas fonctionné, car il semble que d'une certaine manière pour le premier objet du tableau, et non la totalité du tableau .
let predicate = NSPredicate(format: "tableName CONTAINS %@", argumentArray: refs)
ici si j'imprimer les predicate
il imprime:
tableName CONTIENT CKReference: 0x600000229c40; 20B54862-46CC-405F-BAE8-0DC8D3A52F78: (_ defaultZone: defaultOwner)>
Comme vous pouvez le voir, il semble que pour le premier objet du tableau.
Il peut fonctionner si j'utilise l'opérateur ANY
dans le prédicat, quelque chose comme:
let predicate = NSPredicate(format: "ANY { '%@', '%@' } = tableName", args: refs[0], refs[1])
Mais ici mon problème est de savoir comment puis-je construire ce prédicat, puisque le tableau refs
est dynamique et je ne savoir combien d'objets il peut contenir, et par là je ne sais pas comment construire le predicate args
en accédant au [0], [1], ...
du tableau refs
.
Avez-vous une solution de contournement avec cela? Ou une meilleure façon d'aborder ce problème?
Merci.
EDIT
je trouver un moyen de résoudre ce problème, mais je ne sais pas si c'est le plus efficace, donc je suis toujours ouvert à des réponses et des opinions.
Voici ma solution temporaire:
for (i, reference) in refs.enumerated() {
let predicate = NSPredicate(format: "tableName CONTAINS %@", reference)
// CKQuery
// CKQueryOperation
// Database.add(CKQueryOperation)
if i == refs.count - 1 {
// UPDATE UI
}
}
' "tableName EN% @", refs'? – Larme
@Larme puisque la référence est de type REFERENCE_LIST, elle ne peut pas être interrogée à l'aide du type de filtre IN. –
Pour être clair, votre 'tableName' représente une liste de CKReference et vous voulez créer un prédicat en utilisant une autre liste de CKReference pour voir s'il y a une intersection non vide des deux tableaux. Est-ce exact? – rmaddy