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

Я пытался использовать NSCompoundPredicate(orPredicateWithSubpredicates:) с CloudKit NSPredicate, но затем я прочитал в документации 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, он напечатает:

имя_таблицы СОДЕРЖИТ CKReference: 0x600000229c40; 20B54862-46CC-405F-BAE8-0DC8D3A52F78:(_defaultZone:владелец по умолчанию)>

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

Это может сработать, если я использую оператор 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
    }
}

person Ivan Cantarino    schedule 13.09.2017    source источник
comment
@Larme, поскольку ссылка является типом REFERENCE_LIST, ее нельзя запросить с использованием типа фильтра IN.   -  person Ivan Cantarino    schedule 13.09.2017
comment
Чтобы было ясно, ваш tableName представляет собой список CKReference, и вы хотите создать предикат, используя другой список CKReference, чтобы увидеть, есть ли непустое пересечение двух массивов. Это правильно?   -  person rmaddy    schedule 17.09.2017
comment
@rmaddy точно   -  person Ivan Cantarino    schedule 17.09.2017