2017-02-22 1 views
1

CloudKit의 Musics 레코드에서 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 행은 "((_) -> Void, Void) '(일명'(_) ->(),()) ')의 유형을'((CKRecord) -> 공허)? ' " –

+0

마지막 코멘트. 그것은 효과가있다. 그냥 하나의 ")"operation.recordFetchedBlock 함수 후 누락되었습니다. –

관련 문제