2017-02-22 1 views
1

Ich möchte nur das Song_Name-Feld in Musikdatensätzen in CloudKit abrufen. Ich versuche unten Code, aber es holt immer noch alle Felder in Musik aufnehmen. Ich glaube, ich brauche zu kompilieren Betrieb mit publicDB.add (Betrieb) Methode, aber es erlaubt mir nicht, Ergebnisse zu erklären, wie ich mit publicDB.perform jetzt tun (Abfrage, in ....)Nur bestimmte Felder im Cloudkit abrufen?

let predicate = NSPredicate(value: true) 
    let query = CKQuery(recordType: "Musics", predicate: predicate) 
    let operation = CKQueryOperation(query: query) 
    operation.desiredKeys = ["Song_Name"] 

    publicDB.perform(query, inZoneWith: nil) { [unowned self] results, error in 

     guard error == nil else { 
      DispatchQueue.main.async { 
       self.delegate?.errorUpdating(error! as NSError) 
       print("Cloud Query Error - Refresh: \(error)") 
      } 
      return 
     } 
     self.items_music.removeAll(keepingCapacity: true) 
     for record in results! { 
      let music = Musics(record: record, database: self.publicDB) 
      self.items_music.append(music) 
     } 
     DispatchQueue.main.async { 
      self.delegate?.modelUpdated() 
     } 
    } 
} 
+3

Bitte definieren Sie "funktioniert nicht". Das ist die nutzloseste Phrase, die ein Programmierer verwenden kann. Sei genau. Ist es ein Fehler beim Kompilieren? Stürzt es ab? Tut es einfach nicht, was Sie erwarten? [Bearbeiten] Ihre Frage mit Fehlermeldung oder Debugging-Informationen. Erklären Sie klar, was Ihr Code tatsächlich tut und erklären Sie klar, was Sie davon erwarten. Machen Sie es Ihnen leicht, Ihnen zu helfen. Veröffentlichen Sie diese Informationen nicht in Kommentaren. Bitte [bearbeiten] Sie Ihre Frage mit den relevanten Details. – rmaddy

+0

@rmaddy Ich habe die Beschreibung bearbeitet, ja, das ist mir jetzt aufgefallen. Das tut mir leid. –

Antwort

1

Sie erstellen eine CKQueryOperation und setzen die desiredKeys -Eigenschaft der Operation, aber Sie verwenden diese Operation nicht. Sie führen einfach eine Abfrage für die Datenbank durch, sodass keine Eigenschaften der Abfrageoperation verwendet werden.

Sie müssen Ihrer Operation einen Block zum Abrufen von Blöcken und Abfrageabfragen zuweisen und dann die Operation der Datenbank hinzufügen, um sie auszuführen.

let predicate = NSPredicate(value: true) 
let query = CKQuery(recordType: "Musics", predicate: predicate) 
let operation = CKQueryOperation(query: query) 
operation.desiredKeys = ["Song_Name"] 
var newItems = [Musics]() 
operation.queryCompletionBlock = ({ (cursor, error)->Void in 
    guard error == nil else { 

     DispatchQueue.main.async { 
      self.delegate?.errorUpdating(error! as NSError) 
      print("Cloud Query Error - Refresh: \(error)") 
     } 
     return 
    } 
    self.items_music = newItems 
    DispatchQueue.main.async { 
     self.delegate?.modelUpdated() 
    } 
}) 

operation.recordFetchedBlock = ({ (record) -> Void in 
    let music = Musics(record: record, database: self.publicDB) 
    newItems.append(music) 
}) 

publicDB.add(operation) 

ich einige Code weggelassen haben, die Sie benötigen, dass die cursor zum Abschluss Block prüft. Wenn dies nicht nil ist, müssen Sie eine weitere Abfrage abfragen, um weitere Objekte zu holen

+0

Die Zeile operation.recordFetchedBlock gibt den folgenden Fehler an: "Kann keinen Wert vom Typ zuweisen" ((_) -> Void, Void) '(' ((_) ->(),()) ') gibt' ((CKRecord) -> Void)? '" –

+0

Für meinen letzten Kommentar. Es funktioniert. Nur gibt es ein ")" fehlt nach operation.recordFetchedBlock-Funktion. –

Verwandte Themen