2017-02-22 10 views
1

CloudKitのMusicsレコードのSong_Nameフィールドだけを取得したいです。私はコードの下で試していますが、それでも音楽レコードのすべてのフィールドを取得します。私はpublicDB.add(操作)メソッドを使用して操作をコンパイルする必要があると思うが、それは私がpublicDB.performで今のように私は結果を宣言することはできません(クエリで、....)クラウドキット内の特定のフィールドのみを取得しますか?

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行は、 "((_) - > Void、Void) '(別名((_) - >()、())')の型を '((CKRecord) - > Void)? '" –

+0

私の最後のコメントです。それは働いている。単にoperation.recordFetchedBlock関数の後に1つの ")"がありません。 –

関連する問題