![](/img/trans.png)
[英]iOS15 B4 NSPersistentCloudKitContainer "Account Temporarily Unavailable" Error
[英]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.