iOS15:NSPersistentCloudKitContainer:如何取消共享对象?

cop*_*ing 11 core-data ios cloudkit

我\xe2\x80\x99m 正在开发一个应用程序,该应用程序使用 iOS 15 中的新共享支持NSPersistentCloudKitContainer。我没有找到一种方法来告诉 Core Data 一个对象或一组对象不再共享。

\n

例如,如果我创建一组对象然后调用share(_:to:completion:),则这些对象将按预期正确共享并移动到新的自定义CKRecordZone

\n

现在,如果用户停止使用 共享对象UICloudSharingController,则CKShareCore Data 创建的对象会从 CloudKit 中正确删除,但对象仍位于自定义区域中,并且 Core Data 仍具有与这些对象关联的原始对象CKShare。因此,当我致电 时fetchShares(matching:),我仍然得到CKShare,但当然,这不再有效。过去,使用我自己的代码,我\xe2\x80\x99d 使用UISharingControllers delegate 来获取用户停止共享的通知,然后更新我的模型。但似乎没有办法告诉 Core Data 有关更改的信息。

\n

通过将应用程序移至后台然后前台,或停止应用程序并重新启动来强制 Core Data 获取 CloudKit 更改不会导致 Core Data 注意到共享的更改。

\n

有谁知道如何告诉 Core Data 这些对象不再共享?

\n

cop*_*ing 3

我通过始终检查该共享是否确实存在于 CloudKit 中来解决这个问题,而不是依赖于 from 的CKShare存在fetchShares(matching:)URL我从CKShare返回中获取fetchShares(matching:)并称之为:

private func remoteShare(at url: URL) async throws -> CKShare? {
        do {
            let metadata = try await cloudKitContainer.shareMetadata(for: url)
            return metadata.share
        } catch let error as CKError {
            if error.retryable {
                throw RemoteError.retryable
            } else if error.userInterventionRequiredError {
                throw RemoteError.userInterventionRequired
            } else if error.code == .unknownItem {
                return nil
            } else {
                throw RemoteError.remoteFailure
            }
        } catch {
            throw RemoteError.remoteFailure
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我得到unknownItem这意味着远程上没有共享,因此该对象实际上并未共享。

RemoteError是我的自定义错误处理,我有一些扩展来CKError对错误进行分类。