Используйте 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
это печатает:
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];