2017-02-22 37 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函数之后缺少。 –