Используйте CONTAINS или ANY в предикате CloudKit с массивом сравнения

Я пытался использовать NSCompoundPredicate(orPredicateWithSubpredicates:) с CloudKitNSPredicate но потом я прочитал в документации Apple, что OR предикаты сравнения не поддерживаются в CloudKit так что я столкнулся с этим блокпостом.

У меня есть массив CKReferences что мне нужно увидеть, если Record-type из Reference list содержит эти ссылки.

Я борюсь за то, как собрать сам предикат, потому что я пытаюсь избежать вложенных запросов в completionBlock,

допустим, у меня есть следующий массив ссылок:

let refs = [CKReference]() // in my case the array isn't empty

Я попробовал следующее, но это не сработало, потому что каким-то образом он ищет только первый объект массива, а не весь массив.

let predicate = NSPredicate(format: "tableName CONTAINS %@", argumentArray: refs)

Здесь, если я распечатаю predicate это печатает:

tableName CONTAINS CKReference: 0x600000229c40; 20B54862-46CC-405F-BAE8-0DC8D3A52F78: (_ defaultZone:defaultOwner)>

Как видите, он ищет только первый объект в массиве.

Это может сработать, если я использую ANY оператор в предикате, что-то вроде:

let predicate = NSPredicate(format: "ANY { '%@', '%@' } = tableName", args: refs[0], refs[1])

Но моя проблема здесь в том, как я могу построить этот предикат, так как refs массив является динамическим, и я не знаю, сколько объектов он может содержать, и поэтому я не знаю, как построить predicate args доступ к [0], [1], ... из refs массив.

Есть ли у вас какие-либо обходные пути с этим? Или лучший способ подойти к этому вопросу?

Спасибо.

РЕДАКТИРОВАТЬ

Я придумываю способ решить эту проблему, но я не знаю, является ли это наиболее эффективным, поэтому я все еще открыт для ответов и мнений.

Вот мое временное решение:

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
    }
}

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];
Другие вопросы по тегам