CloudKit 分享

Dun*_*ald 5 ios cloudkit

我在理解某些 CloudKit 共享概念时遇到问题,并且 WWDC 2016“CloudKit 的新功能”视频似乎没有解释允许用户共享和访问共享记录所需的一切。

我已经成功创建了一个应用程序,允许用户在他们的私人数据库中创建和编辑记录。我还能够创建共享记录并使用提供的共享 UIController 共享它。这可以被参与者用户成功接收和接受,但我不知道如何查询和显示此共享记录。

该应用程序在用户私有数据库中创建一个“MainZone”,然后在这个“MainZone”中创建一个 CKRecord。然后我创建并保存一个 CKShare 记录并使用它来显示 UICloudSharingController。

如何查询 sharedDatabase 以访问此记录?我尝试使用与 privateDatabase 中使用的相同的查询,但出现以下错误:

"ShareDB can't be used to access local zone"
Run Code Online (Sandbox Code Playgroud)

编辑

我发现了问题 - 我需要处理 AppDelegate 中接受的记录。现在它们出现在 CloudKit 仪表板中,但我仍然无法查询它们。看来我可能需要获取共享数据库“MainZone”才能查询它们。

Ped*_* Sá 4

伙计,我明白了:首先您需要获取该共享记录的CKRecordZone。您可以通过执行以下操作来完成此操作:

let sharedData = CKContainer.default().sharedCloudDatabase
    sharedData.fetchAllRecordZones { (recordZone, error) in
        if error != nil {
            print(error?.localizedDescription)
        }
        if let recordZones = recordZone {
            // Here you'll have an array of CKRecordZone that is in your SharedDB!
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,有了该数组,您所要做的就是正常获取:

func showData(id: CKRecordZoneID) {

    ctUsers = [CKRecord]()

    let sharedData = CKContainer.default().sharedCloudDatabase
    let predicate = NSPredicate(format: "TRUEPREDICATE")
    let query = CKQuery(recordType: "Elder", predicate: predicate)

    sharedData.perform(query, inZoneWith: id) { results, error in
        if let error = error {
            DispatchQueue.main.async {
                print("Cloud Query Error - Fetch Establishments: \(error)")
            }
            return
        }
        if let users = results {
            print(results)
            self.ctUsers = users
            print("\nHow many shares in cloud: \(self.ctUsers.count)\n")
            if self.ctUsers.count != 0 {
                // Here you'll your Shared CKRecords!
            }
            else {
                print("No shares in SharedDB\n")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不推荐这种方法,如果有数百万用户共享内容会发生什么?将会有数百万个 recordZone,因此这个查询可能会非常大。我认为正确的方法似乎是存储对与用户共享的内容的本地引用,并使用它们来查询更改。我认为这个想法也是为了最大限度地减少查询,而是注册更改,然后处理更改 - 但我担心在某些情况下这也可能导致过多的推送流量。 (2认同)