Ios 使用Swift获取CloudKit中的记录资产

Ios 使用Swift获取CloudKit中的记录资产,ios,swift,cloudkit,Ios,Swift,Cloudkit,我是CloudKit新手,在将数据库中的资产连接到应用程序中的ImageView和TextView时遇到问题。在我的CloudKit数据库中的记录类型下,我创建了一个名为“companys”的记录。然后,我转到publicdata->defaultzone,然后创建了一个名为“myCompany”的新记录实例。在“myCompany”中,我有两个资产,一个图像和一个.txt文件。我想将这些资产连接到我的应用程序。我不确定是否需要使用CKQuery,或者最好的方法是什么。任何建议都将不胜感激。以下

我是CloudKit新手,在将数据库中的资产连接到应用程序中的ImageView和TextView时遇到问题。在我的CloudKit数据库中的记录类型下,我创建了一个名为“companys”的记录。然后,我转到publicdata->defaultzone,然后创建了一个名为“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
        }
    }

如果您知道recordId,则可以直接获取记录,方法如下:

database.fetchRecordWithID(CKRecordID(recordName: recordId), completionHandler: {record, error in
或者,如果您不知道ID,您应该使用下面的代码查询记录。只需创建正确的NSPredicate。一个查询可以返回多条记录

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
            }
        }
    }
}

如何将第一个选项集成到当前代码中?我不知道如何使用fetchRecordWithID。我知道具体的ID。我在答案中添加了示例代码。您必须用正确的ID替换recordId,并且recordId只是一个字符串?是的,这类似于“C6F204D2-2F40-481F-926A-F2DF0863A7B8”。您必须小心代码中的固定recordId。当您迁移到生产环境时,将不会迁移开发环境中的数据。您必须创建一个新记录,该记录还将获得一个新的recordID