Извлечение ресурсов записи в CloudKit с помощью Swift

Я новичок в CloudKit, и у меня возникли проблемы с подключением активов в моей базе данных к ImageView и TextView в моем приложении. В моей базе данных CloudKit в разделе типов записей я создал запись с именем «Компании». Затем я перешел в «Общие данные» -> «Зона по умолчанию», а затем создал новый экземпляр записи под названием «myCompany». В «myCompany» у меня есть два актива: изображение и файл .txt. Я хочу подключить эти активы к своему приложению. Я не уверен, нужно ли мне использовать CKQuery или какой подход лучше всего. Любые советы будут высоко ценится. Ниже то, что у меня есть до сих пор. Не стесняйтесь давать отзывы о том, что у меня есть, или если есть лучший способ, я хотел бы знать. Спасибо.

import UIKit
import CloudKit

class LearnViewController: UIViewController {

@IBOutlet weak var theImage: UIImageView!
@IBOutlet weak var theText: UITextView!


let myRecord = CKRecord(recordType: "Companies" )

var image: UIImage!

let database =  CKContainer.defaultContainer().publicCloudDatabase


func loadCoverPhoto(completion:(photo: UIImage!) -> ()) {
    dispatch_async(
        dispatch_get_global_queue(
            DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)){
                var image: UIImage!
                let coverPhoto = self.myRecord.objectForKey("Picture") as CKAsset!
                if let asset = coverPhoto {

                    if let url = asset.fileURL {
                        let imageData = NSData(contentsOfFile: url.path!)!

                        image = UIImage(data: imageData) 
                    }
                }

                completion(photo: image)
    }
}


 override func viewDidLoad() {
    super.viewDidLoad()

    loadCoverPhoto() { photo in
        dispatch_async(dispatch_get_main_queue()) {
            self.theImage.image = photo
        }
    }

person Jeff Richard    schedule 29.01.2015    source источник


Ответы (1)


Вы можете получить запись напрямую, если знаете RecordId, выполнив выборку, например:

database.fetchRecordWithID(CKRecordID(recordName: recordId), completionHandler: {record, error in

Или, если вы не знаете идентификатор, вы должны запросить запись с помощью кода, подобного приведенному ниже. просто создайте правильный NSPredicate. Запрос может вернуть более 1 записи.

var query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
var operation = CKQueryOperation(query: query)
operation.recordFetchedBlock = { record in
    // is this your record...
}
operation.queryCompletionBlock = { cursor, error in
    self.handleCallback(error, errorHandler: {errorHandler(error: error)}, completionHandler: {
        // ready fetching records
        })
}
operation.resultsLimit = CKQueryOperationMaximumResults;
database.addOperation(operation)

В вашем случае при использовании опции fetchRecordWithID код будет выглядеть так:

override func viewDidLoad() {
    super.viewDidLoad()

    database.fetchRecordWithID(CKRecordID(recordName: recordId), completionHandler: {record, error in
        self.myRecord = record
        loadCoverPhoto() { photo in
            dispatch_async(dispatch_get_main_queue()) {
                self.theImage.image = photo
            }
        }
    }
}
person Edwin Vermeer    schedule 29.01.2015
comment
Как мне интегрировать первый вариант в мой текущий код? Я запутался, как использовать fetchRecordWithID. Я знаю конкретный идентификатор. - person Jeff Richard; 29.01.2015
comment
Я добавил пример кода в ответ. Вы должны заменить recordId правильным идентификатором - person Edwin Vermeer; 29.01.2015
comment
а recordID будет просто строкой? - person Jeff Richard; 29.01.2015
comment
да, это будет что-то вроде C6F204D2-2F40-481F-926A-F2DF0863A7B8 - person Edwin Vermeer; 29.01.2015
comment
Вы должны быть осторожны с фиксированными идентификаторами записей в своем коде. При переходе к производству данные из разработки не будут перенесены. Вам нужно будет создать новую запись, которая также получит новый идентификатор записи. - person Edwin Vermeer; 29.01.2015
comment
Я запутался, потому что с let myRecord = CKRecord(recordType: Companies ) и моим текущим кодом, разве я не должен получать доступ к своим активам и иметь возможность подключать их к моему ImageView? Я не понимаю, зачем мне нужен идентификатор или запрос, когда я уже знаю имя через RecordType? - person Jeff Richard; 29.01.2015
comment
Что-то не так в моем коде, чтобы объяснить, почему мое изображение в CloudKit не отображается в моем приложении? Я очень ценю ваши ответы, но я не понимаю, как все это связано друг с другом. - person Jeff Richard; 29.01.2015
comment
вы можете сравнить RecordType с таблицей. Таким образом, у вас может быть несколько компаний. Вам необходимо получить запись конкретной компании из CloudKit. Вы можете получить его, используя идентификатор записи, или запросить компании, используя CKQuery. - person Edwin Vermeer; 29.01.2015
comment
Я заставил его работать с помощью CKQuery. Спасибо за помощь. У меня есть еще один вопрос. В базе данных CloudKit я создаю запись в разделе «Типы записей» под названием «Компании». Теперь в Public-›Default Zone я создаю экземпляр Companies под названием Apple. Как мне получить доступ к Apple, если у меня есть другие компании. У меня просто есть предикат let = NSPredicate(value: true) let query = CKQuery(recordType: Companies, predicate: predicate) - person Jeff Richard; 29.01.2015
comment
Вы можете выполнять все виды фильтрации с помощью NSPredicate. Например, вы можете запустить запрос типа NSPredicate (формат: Company = %@, selectCompany) - person Edwin Vermeer; 30.01.2015
comment
Что, если вместо того, чтобы возвращать две конкретные записи, вы хотите добавить массив из нескольких записей? Как бы вы это сделали? - person Andy Dewan; 07.02.2015
comment
Если вы хотите найти массив компаний, вы можете использовать такой предикат, как NSPredicate(format: Company in %@, [selectCompany]) - person Edwin Vermeer; 07.02.2015