Как использовать fetchWithRecordID для автоматически сгенерированного идентификатора в CloudKit Dashboard?

Я новичок в разработке CloudKit и iOS. Я вручную добавил некоторые записи на панель инструментов CloudKit, и теперь я хочу получить их по их идентификаторам, которые были созданы автоматически. И затем я хочу отобразить значение записи в UILabel для статической ячейки таблицы. Возникли две проблемы: 1). Я получаю сообщение об ошибке в xCode при использовании идентификатора с панели инструментов (ошибка говорит «ожидаемый», «разделитель»); и 2). Я не могу найти примеров размещения значения записи в UILabel в статической ячейке таблицы. (особенно для быстрого). Любая помощь приветствуется!

Вот мой код:

override func viewDidLoad() {
    super.viewDidLoad()

    publicDB.fetchRecordWithID (f7080e7a-f8c3-4db6-b8ee-642a011a6762) { record, error in


        if error != nil {

            println("there was an error \(error)")

        } else {

            // this is my UILabel in a static tableview. The record's only attribute is //called "subCategory"

            plasticOneValue.text = record["subCategory"]
        }   
    }
}

ОБНОВЛЕНИЕ: АЛЬТЕРНАТИВНО. Я попробовал этот код, и сборка прошла успешно, но консоль сообщила, что произошла внутренняя ошибка, а UILabel по-прежнему пуст...... Любые предложения о том, что я делаю неправильно с приведенным выше кодом или этим кодом?

override func viewDidLoad() {
    super.viewDidLoad()

    // I created a new CKRecord ID Object and provided the existing ID in dashboard and //it fixed the error about requiring a "," separator

   var plasticOneID = CKRecordID(recordName: "f7080e7a-f8c3-4db6-b8ee-642a011a6762")

    publicDB.fetchRecordWithID (plasticOneID) { record, error in

        if error != nil {

            println("there was an error \(error)")

        } else {

            self.plasticOne.text = (record.objectForKey("subCategory") as String)

        }
    }
}

person Renee Olson    schedule 03.12.2014    source источник


Ответы (1)


это 2 разные проблемы

  1. при запросе идентификатора вы должны запрашивать CKRecordID, как вы делали во втором примере.
  2. При доступе к пользовательскому интерфейсу вы должны сделать это в основной очереди.

Итак, тогда код будет примерно таким:

publicDB.fetchRecordWithID(CKRecordID(recordName: "f7080e7a-f8c3-4db6-b8ee-642a011a6762"), completionHandler: {record, error in
    if error != nil {
        println("there was an error \(error)")
    } else {
        NSOperationQueue.mainQueue().addOperationWithBlock {
            self.plasticOne.text = (record.objectForKey("subCategory") as String)
        }
   }
})
person Edwin Vermeer    schedule 03.12.2014
comment
Когда я пробую ваш код, я все еще получаю эту ошибку, поэтому я, должно быть, делаю что-то еще неправильно - произошла ошибка ‹CKError 0x7facda201b30: Internal Error (1/2005)› У меня также есть этот код - import UIKit import CloudKit let myContainer:CKContainer = CKContainer.defaultContainer() let publicDB: CKDatabase = myContainer.publicCloudDatabase let privateDB: CKDatabase = myContainer.privateCloudDatabase class TableViewController: UITableViewController { @IBOutlet weak var plasticOne: UILabel! @IBOutlet weak var plasticTwo: UILabel! @IBOutlet weak var plasticThree: UILabel! @EdwinVermeer - person Renee Olson; 04.12.2014
comment
Спасибо за дополнительную информацию об очереди. Я еще учусь. Нужно ли мне вызывать этот NSOperationQueue.mainQueue каждый раз, когда я извлекаю, сохраняю или обновляю данные в пользовательском интерфейсе? И при каких обстоятельствах я буду использовать фоновую очередь? Заранее спасибо за вашу помощь! - person Renee Olson; 04.12.2014
comment
Все блоки обратного вызова всегда вызываются в отдельной очереди. Если вы манипулируете пользовательским интерфейсом, вам нужно делать это в основной очереди. Вы уверены, что запись с этим идентификатором есть в вашей общедоступной базе данных? Код ошибки 2005 странный. Используете ли вы на своем устройстве ту же учетную запись iCloud, что и учетную запись разработчика? может быть, этот RecordID находится в частной БД, а вы запрашиваете общедоступную БД? - person Edwin Vermeer; 04.12.2014
comment
запись находится в зоне по умолчанию publicDB. И я использую симулятор. Все еще получаю эту ошибку. Любые другие мысли? Вопрос новичка, но что такое блок обратного вызова и когда он используется? Спасибо еще раз! @ЭдвинВермеер - person Renee Olson; 05.12.2014
comment
параметр completeHandler в fetchRecordWithID часто называют блоком обратного вызова. fetchRecordWithID будет выполнять код в отдельном потоке (очереди), чтобы ваше приложение не блокировалось во время выборки. В тот момент, когда выборка будет готова, она вызовет код в завершенииHandler. Поскольку это все еще выполняется в фоновом потоке, вам нужно выполнить другой блок кода в основной очереди. Вот почему addOperationWithBlock существует. - person Edwin Vermeer; 05.12.2014
comment
Спасибо Эдвин за объяснение. Является ли NSOperation чем-то, что в основном используется при общении с сетью (или облаком) для получения данных вне клиента? Будет ли он также использоваться для других целей, таких как получение push-уведомления после подписки на изменения в БД? - person Renee Olson; 05.12.2014
comment
В тот момент, когда для завершения операции требуется некоторое время (например, вычисления, сетевая активность или массовая обработка данных), она обычно выполняется в отдельной очереди, чтобы поддерживать отзывчивость пользовательского интерфейса. - person Edwin Vermeer; 05.12.2014
comment
ваш код сработал ... немного неловко, но я не знал, что у меня не проверялись настройки iCloud в течение нескольких дней. Спасибо еще раз! - person Renee Olson; 11.12.2014