2017-09-13 4 views
2

j'ai essayé d'utiliser NSCompoundPredicate(orPredicateWithSubpredicates:) avec CloudKitNSPredicate 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 
    } 
} 
+0

' "tableName EN% @", refs'? – Larme

+0

@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. –

+0

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

Répondre

1
NSMutableArray * tagsReferencesArray = [[NSMutableArray alloc] init]; 

    [tagsReferencesArray addObject:tag100_Reference]; 
    [tagsReferencesArray addObject:tag300_Reference]; 
    [tagsReferencesArray addObject:tag200_Reference]; 

predicate= [NSPredicate predicateWithFormat:@"ANY %@ in field_TagsReferenceList ", tagsReferencesArray];