2017-06-02 46 views
0

的阵列我有一个类Download用作用于CKQueryOperation的包装。其中inits允许我建立我的谓词值的数组:夫特谓词只匹配第一个值在值

init(type: String, queryField: String, queryValues: [CKRecordValue], to rec: RecievesRecordable, from database: CKDatabase? = nil) { 
    let predicate = NSPredicate(format: "\(queryField) = %@", argumentArray: queryValues) 
    query = CKQuery(recordType: type, predicate: predicate) 

    reciever = rec 
    db = database 

    super.init() 
} 

当我测试了一下,query仅匹配数组中的第一个值。所以,如果queryValues = [testValue0, testValue1],我有一个记录,其字段匹配testValue0,我有匹配testValue1第二记录,仅在第一记录将被发现。如果我切换订单,则会识别其他记录。

这似乎不可思议的是我可以创建一个谓词的数组,但只有第一个值被匹配。文档说,价值观是他们出现的顺序取代,但应该不是仍然可以在移动到第二个值?

更多情况下,每个记录存储在一个单独的数据库(私人与公开)以及我的Download类推出两个独立CKQueryOperations,它们都依赖query,如果database参数是左零。 无论哪个操作失败,都会找到没有匹配第一个值的结果,然后在检查第二个值之前放弃。

,如果需要,我可以包括“下载”完整的代码和我的失败的单元测试。

回答

2

您使用了错误的断言。您想要使用IN操作。和,而不是使用字符串替换该字段名称,使用%K格式说明:

let predicate = NSPredicate(format: "%K IN %@", arguments: queryField, queryValues) 

注意,NSPredicate(format:argumentArray:)期望有是在格式字符串参数阵列中的每个值的一个格式指示符。由于您的格式只有一个格式说明符,因此只有第一个值来自数组。而且,由于您使用了=,因此仅将该字段与该值进行了比较。

+0

非常感谢您回复我。我远离我的代码atm,但这很有道理。一旦我有机会确认它解决了我的问题,我会接受这个答案。 –

+0

工作过,谢谢! –

相关问题