2017-02-22 50 views
1

Я хочу получить только поле Song_Name в записях Musics в CloudKit. Я пытаюсь сделать код ниже, но он по-прежнему извлекает все поля в записи музыки. Я думаю, что нужно компилировать операцию методом 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) »(aka '((_) ->(),())') для ввода '((CKRecord) -> Void)? '" –

+0

Для моего последнего комментария. Это работает. Просто есть одно ")" отсутствует после функции operation.recordFetchedBlock. –