【问题标题】:CKQuery with CloudKit IssueCKQuery 与 CloudKit 问题
【发布时间】:2015-09-14 21:55:33
【问题描述】:

我对 CloudKit 很陌生,我只是想运行最基本的查询。我想从 RecordType "Users" 和字段类型 "Name" 中提取,并且名称等于我的 nameText 标签!

请看我下面的代码:

 func getUserInformation() {
    let Pred = NSPredicate(value: true)
    let Query = CKQuery(recordType: "Namer", predicate: Pred)
    let AgeOp = CKQueryOperation(query: Query)
    AgeOp.database = self.Pub
    AgeOp.recordFetchedBlock = {(record : CKRecord!) in
        let Recorded : CKRecord = record!
        self.nameText.text = Recorded.objectForKey("Name") as? String
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    self.Container = CKContainer.defaultContainer() as CKContainer
    self.Pub = Container.publicCloudDatabase as CKDatabase
    self.Container.accountStatusWithCompletionHandler {
        accountStatus, error in
        if error != nil {

            print("Error: \(error?.localizedDescription)")
        } else {
    self.getUserInformation()
        }
    }

}

【问题讨论】:

  • 那么您的问题是什么?要具体。

标签: swift cloudkit ckquery


【解决方案1】:

Users 是一个系统表。您可以向其中添加新字段,但建议不要这样做。主要原因之一是您无法查询用户记录类型。

除此之外,我在您的代码中看到您查询的是recordType Namer 而不是Users。你的问题是错的还是你的代码错了?

recordFetchedBlock 中,您直接将结果放入.text。该块将在后台线程中执行。你应该先去mainQueue。你可以这样做:

AgeOp.recordFetchedBlock = {(record : CKRecord!) in
  NSOperationQueue.mainQueue().addOperationWithBlock { 
    let Recorded : CKRecord = record!
    self.nameText.text = Recorded.objectForKey("Name") as? String
   } 
}

当没有查询匹配时,.recordFetchedBlock 将永远不会被调用。您还应该设置 .queryCompletionBlock

查询可能返回多条记录(如果有更多同名的人)。在recordFetchedBlock 中,您应该将记录添加到数组中。然后在 .queryCompletionBlock 你可以使用那个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多