2017-09-13 79 views
2

數組我試圖用NSCompoundPredicate(orPredicateWithSubpredicates:)CloudKitNSPredicate但後來我對蘋果的文檔閱讀OR比較謂詞不CloudKit支持,所以我打了一個路障與此有關。的用法中或任何CloudKit謂詞比較

我有一個CKReferences的數組,我需要看看Record-typeReference 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訪問refs陣列的[0], [1], ...

你對此有任何解決方法嗎?或者解決這個問題的最佳途徑?

謝謝。

編輯

我想出一個辦法來解決這個問題,但我不知道這是最有效的一個,所以我還是打開的答案和意見。

這裏是我的臨時解決方案:

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

「 」表名IN%@「,refs'? – Larme

+0

@Larme由於引用是REFERENCE_LIST類型,因此無法使用過濾器類型IN查詢。 –

+0

要清楚的是,你的'tableName'表示一個CKReference列表,並且你想使用另一個CKReference列表來創建一個謂詞來查看這兩個數組是否存在非空的交集。那是對的嗎? – rmaddy

回答

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];