2017-02-22 55 views
1

我只想在CloudKit中的音樂記錄中僅提取Song_Name字段。我試着在代碼下面,但它仍然提取音樂記錄中的所有字段。我想我需要編譯publicDB.add(操作)方法操作,但它不允許我宣佈結果我現在publicDB.perform做(查詢中,....)只抓取cloudkit中的特定字段?

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

請定義「不工作」。這是程序員可以使用的最無用的短語。請明確點。編譯時是否有錯誤?它會崩潰嗎?它是否不符合你的期望?用錯誤信息或調試信息[編輯]你的問題。清楚地解釋你的代碼實際上做了什麼,並清楚地解釋你期望它做什麼。讓人們很容易幫助你。不要在評論中發佈此信息。請編輯您的問題並提供相關詳細信息。 – rmaddy

+0

@rmaddy我編輯了描述,是的,現在我注意到了。對不起。 –

回答

1

您正在創建一個CKQueryOperation並設置操作的desiredKeys屬性,但這時您並未使用此操作。您只需針對數據庫執行查詢,因此不會使用查詢操作的任何屬性。

您需要爲您的操作指定一個記錄獲取塊和查詢完成塊,然後將操作添加到數據庫以實際運行它。

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) 

我省略了一些代碼,您將需要檢查提供給完成塊的cursor。如果這不是nil那麼您需要發出另一個查詢來獲取其他項目

+0

operation.recordFetchedBlock line給出這個錯誤「Can not assign value of type'((_) - > Void,Void)'(aka'((_) - >(),())')to type'((CKRecord) - >無效)?'「 –

+0

爲我的最後評論。這是工作。只有一個「)」在operation.recordFetchedBlock函數之後缺少。 –