2017-06-02 4 views
0

Ich habe eine Klasse Download, die als Wrapper für CKQueryOperation dient. Einer der inits ermöglicht es mir, mein Prädikat mit einem Array von Werten zu bauen:Swift-Prädikat entspricht nur dem ersten Wert im Wertefeld

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() 
} 

Als ich es testen, query nur den ersten Wert im Array entspricht. Also, wenn queryValues = [testValue0, testValue1] und ich einen Datensatz haben, dessen Feld testValue0 entspricht und ich einen zweiten Datensatz habe, der testValue1 entspricht, wird nur der erste Datensatz entdeckt. Wenn ich die Reihenfolge ändere, wird der andere Datensatz erkannt.

Es scheint seltsam, dass Ich kann ein Prädikat mit einem Array erstellen, aber nur der erste Wert wird abgeglichen. Die Dokumentation sagt, dass Werte in der Reihenfolge, in der sie erscheinen, ersetzt werden, aber sollte es nicht immer noch auf den zweiten Wert weitergehen?

Weiteren Zusammenhang wird jeder Datensatz in einer separaten Datenbank (privat vs public) gespeichert und meine Download Klasse startet zwei separate CKQueryOperations, die beide auf query, wenn database param Null bleiben. Welche Operation fehlschlägt, findet keine Ergebnisse, die mit dem ersten Wert übereinstimmen, und gibt dann auf, bevor der zweite Wert überprüft wird.

Ich kann den vollständigen Code für "Download" und meinen fehlgeschlagenen Komponententest bei Bedarf einfügen.

Antwort

2

Sie verwenden das falsche Prädikat. Sie möchten die Operation IN verwenden. Und statt String-Ersetzung für die Feldnamen zu verwenden, verwenden Sie die %K Formatbezeichner:

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

Beachten Sie, dass die NSPredicate(format:argumentArray:) dort erwarten im Argument-Array für jeden Wert ein Format im Format-String zu sein. Da Ihr Format nur einen Formatbezeichner hatte, wurde nur der erste Wert aus dem Array genommen. Und da Sie = verwendet haben, wurde das Feld einfach mit diesem einen Wert verglichen.

+0

Vielen Dank für die Rückmeldung an mich. Ich bin weg von meinem Code atm, aber das macht sehr viel Sinn. Ich werde diese Antwort akzeptieren, sobald ich die Möglichkeit habe zu bestätigen, dass sie mein Problem löst. –

+0

Arbeitete, danke! –

Verwandte Themen