2015-03-31 3 views
3

Я пытаюсь сделать это с помощью составного предиката с помощью Cloudkit, но ошибка Xcode говорит «Неожиданное выражение». Кто-нибудь знает, что не так с моим кодом? Цените любую помощь!NSCompoundPredicate и Cloudkit

let userRef = CKReference(recordID: userID, action: .None) 

    let predicateOne = NSPredicate(format: "recordID IN %@ AND user = %@", postIDs, userRef) 
// I need all user post's that match the IDs in the array and where the user ID matches the Id in the reference field for the user. 

    let predicateTwo = NSPredicate(format: "recordID IN %@", followIDs) 
// Or I want recordID's that match the IDs in this array. 
// I want records if either predicate condition is met, or both, which is why I'm using an OrPredicateType. 

    let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [predicateOne!, predicateTwo!]) 
    let query = CKQuery(recordType: "UserPosts", predicate: predicate) 
    let queryOp = CKQueryOperation(query: query) 
+0

Не понимаю, почему эти предикаты потерпят неудачу. Можете ли вы указать точную ошибку, которую вы получаете? – farktronix

+0

Являются ли PostIDs и followIDs массивами CKReferences для CKRecordID? – Marcus

+0

@Marcus. Эти массивы являются идентификаторами recordID, и я запрашиваю индексы метаданных для этих идентификаторов записи. Переменная userRef является CKReference. –

ответ

2

Есть некоторые правила использования NSPredicate для CloudKit. Для получения дополнительной информации см Apple documentation

Что вы могли бы попробовать это создать предикат, как это:

NSPredicate(format: "recordID IN %@ OR (recordID IN %@ AND user = %@)", followIDs, postIDs, userRef) 

Но у меня есть плохой опыт с использованием предиката с обоими И и ИЛИ заявления в нем. Это предикат не работает, тогда я думаю, что единственным решением является выполнение 2 отдельных запросов, а затем объединение результата. Вы можете сделать это, используя функцию объединения из библиотеки ExSwift.

+0

К сожалению, это не сработало, поскольку оно дает такую ​​же ошибку, но спасибо за помощь. Я проверю эту функцию объединения, которую вы упомянули. @EdwinVermeer. –

+0

У вас есть лучшая практика для выполнения нескольких запросов? Я использовал queryCompletionBlock из первого запроса для вызова другой функции, содержащей следующий запрос. И тогда я все еще не уверен, что делать, если вы получаете курсор, где вы не хотите, чтобы первая партия записей обрабатывалась до тех пор, пока вы не запустите второй запрос. Я слышал об использовании зависимостей. Цените любые мысли, которые у вас есть. @EdwinVermeer –

+0

Обычно я это делаю. (вызовите второй из блока завершения). Если вы хотите использовать курсор для непрерывного выполнения запроса, попробуйте записать его рекурсивным (если курсор затем вызывается сам, иначе вызывается второй запрос). Вы можете использовать обещания или фьючерсы для оптимизации этого. См. Https://github.com/Thomvis/BrightFutures или https://github.com/ReactKit/SwiftTask. Кроме того, я, конечно же, все мои работы CloudKit, используя https://github.com/evermeer/EVCloudKitDao –

 Смежные вопросы

  • Нет связанных вопросов^_^