簡體   English   中英

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

[英]iOS15: NSPersistentCloudKitContainer: how to un-share objects?

我正在開發一個使用NSPersistentCloudKitContainer在 iOS 15 中使用新共享支持的應用程序。 我沒有看到告訴 Core Data 一個對象或一組對象不再共享的方法。

例如,如果我創建一組對象,然后調用share(_:to:completion:) ,這些對象將正確共享CKRecordZone預期移動到新的自定義CKRecordZone

現在,如果用戶停止使用UICloudSharingController共享對象,Core Data 創建的CKShare會從 CloudKit 中正確刪除,但對象仍在自定義區域中,Core Data 仍然具有與這些對象關聯的原始CKShare 所以,當我調用fetchShares(matching:) ,我仍然得到CKShare ,但當然,這不再有效。 過去,使用我自己的代碼,我會使用UISharingController的委托來獲得用戶停止共享的通知,然后更新我的模型。 但是似乎沒有辦法告訴 Core Data 有關更改的信息。

通過將應用程序移至后台然后移至前台,或通過停止應用程序並重新啟動來強制 Core Data 獲取 CloudKit 更改不會導致 Core Data 注意到共享的更改。

有誰知道如何告訴 Core Data 這些對象不再共享?

我通過始終檢查共享是否確實存在於 CloudKit 中來解決這個問題,而不是依賴於fetchShares(matching:) CKShare的存在。 我從fetchShares(matching:)返回的CKShare獲取URL並調用它:

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

如果我得到unknownItem ,則意味着遙控器上沒有共享,因此該對象實際上並未共享。

RemoteError是我的自定義錯誤處理,我對CKError有一些擴展來對錯誤進行分類。

該問題的另一個解決方法是創建共享對象的副本,然后刪除原始對象。 這並不優雅,但它同時起作用。 (希望 Apple 會在某個時候用更好的解決方案來解決這個問題。)副本將被放置在默認區域中,就像在您共享原件之前一樣。 你會留下一個空的共享區域,但我通過在應用程序啟動時運行后台任務來處理這個問題,該任務會刪除所有空共享區域,因此它不會失控。

我還沒有嘗試過 Dharman 發布的解決方案,但我認為它比查詢本地緩存慢。 使用上述方法,您仍然可以使用演示應用程序中的“isShared”代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM