2017-09-13 47 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];