From 4834399b8d79de495818eb2314ac4eb5cf59685e Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 3 Apr 2020 21:20:55 -0500 Subject: [PATCH] Beefed up CloudKit error handling. --- .../Account/Account.xcodeproj/project.pbxproj | 8 ++++---- ...ror+Extensions.swift => CloudKitError.swift} | 17 ++++++++++++++--- Frameworks/Account/CloudKit/CloudKitZone.swift | 12 ++++++------ .../Account/CloudKit/CloudKitZoneResult.swift | 6 +++--- 4 files changed, 27 insertions(+), 16 deletions(-) rename Frameworks/Account/CloudKit/{CKError+Extensions.swift => CloudKitError.swift} (95%) diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index b71ebc288..38efd6984 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -42,6 +42,7 @@ 5144EA49227B497600D19003 /* FeedbinAPICaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */; }; 5144EA4E227B829A00D19003 /* FeedbinAccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */; }; 514BF5202391B0DB00902FE8 /* SingleArticleFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 514BF51F2391B0DB00902FE8 /* SingleArticleFetcher.swift */; }; + 5150FFFE243823B800C1A442 /* CloudKitError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5150FFFD243823B800C1A442 /* CloudKitError.swift */; }; 5154367B228EEB28005E1CDF /* FeedbinImportResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5154367A228EEB28005E1CDF /* FeedbinImportResult.swift */; }; 515E4EB52324FF8C0057B0E7 /* CredentialsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515E4EB22324FF8C0057B0E7 /* CredentialsManager.swift */; }; 515E4EB62324FF8C0057B0E7 /* URLRequest+RSWeb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515E4EB32324FF8C0057B0E7 /* URLRequest+RSWeb.swift */; }; @@ -62,7 +63,6 @@ 51BC8FCC237EC055004F8B56 /* Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BC8FCB237EC055004F8B56 /* Feed.swift */; }; 51BFDECE238B508D00216323 /* ContainerIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BFDECD238B508D00216323 /* ContainerIdentifier.swift */; }; 51C034DF242D65D20014DC71 /* CloudKitZoneResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C034DE242D65D20014DC71 /* CloudKitZoneResult.swift */; }; - 51C034E1242D660D0014DC71 /* CKError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C034E0242D660D0014DC71 /* CKError+Extensions.swift */; }; 51D58755227F53BE00900287 /* FeedbinTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D58754227F53BE00900287 /* FeedbinTag.swift */; }; 51D5875A227F630B00900287 /* tags_delete.json in Resources */ = {isa = PBXBuildFile; fileRef = 51D58757227F630B00900287 /* tags_delete.json */; }; 51D5875B227F630B00900287 /* tags_add.json in Resources */ = {isa = PBXBuildFile; fileRef = 51D58758227F630B00900287 /* tags_add.json */; }; @@ -277,6 +277,7 @@ 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAPICaller.swift; sourceTree = ""; }; 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountDelegate.swift; sourceTree = ""; }; 514BF51F2391B0DB00902FE8 /* SingleArticleFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleArticleFetcher.swift; sourceTree = ""; }; + 5150FFFD243823B800C1A442 /* CloudKitError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CloudKitError.swift; sourceTree = ""; }; 5154367A228EEB28005E1CDF /* FeedbinImportResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinImportResult.swift; sourceTree = ""; }; 515E4EB22324FF8C0057B0E7 /* CredentialsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CredentialsManager.swift; sourceTree = ""; }; 515E4EB32324FF8C0057B0E7 /* URLRequest+RSWeb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URLRequest+RSWeb.swift"; sourceTree = ""; }; @@ -298,7 +299,6 @@ 51BC8FCB237EC055004F8B56 /* Feed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Feed.swift; sourceTree = ""; }; 51BFDECD238B508D00216323 /* ContainerIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerIdentifier.swift; sourceTree = ""; }; 51C034DE242D65D20014DC71 /* CloudKitZoneResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudKitZoneResult.swift; sourceTree = ""; }; - 51C034E0242D660D0014DC71 /* CKError+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CKError+Extensions.swift"; sourceTree = ""; }; 51D58754227F53BE00900287 /* FeedbinTag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinTag.swift; sourceTree = ""; }; 51D58757227F630B00900287 /* tags_delete.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = tags_delete.json; sourceTree = ""; }; 51D58758227F630B00900287 /* tags_add.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = tags_add.json; sourceTree = ""; }; @@ -521,13 +521,13 @@ 5103A9D7242253DC00410853 /* CloudKit */ = { isa = PBXGroup; children = ( - 51C034E0242D660D0014DC71 /* CKError+Extensions.swift */, 512DD4CA2431000600C17B1F /* CKRecord+Extensions.swift */, 5103A9D82422546800410853 /* CloudKitAccountDelegate.swift */, 51E4DB2F2426353D0091EB5B /* CloudKitAccountZone.swift */, 512DD4CC2431098700C17B1F /* CloudKitAccountZoneDelegate.swift */, 519E84A72434C5EF00D238B0 /* CloudKitArticlesZone.swift */, 519E84AB2435019100D238B0 /* CloudKitArticlesZoneDelegate.swift */, + 5150FFFD243823B800C1A442 /* CloudKitError.swift */, 51E4DB2D242633ED0091EB5B /* CloudKitZone.swift */, 51C034DE242D65D20014DC71 /* CloudKitZoneResult.swift */, ); @@ -1099,6 +1099,7 @@ 51E5959B228C781500FCC42B /* FeedbinStarredEntry.swift in Sources */, 846E77451F6EF9B900A165E2 /* Container.swift in Sources */, 9EA643D3239305680018A28C /* FeedlySearchOperation.swift in Sources */, + 5150FFFE243823B800C1A442 /* CloudKitError.swift in Sources */, 9E5EC15D23E0D58500A4E503 /* FeedlyFeedParser.swift in Sources */, 9E1D15532334304B00F4944C /* FeedlyGetStreamContentsOperation.swift in Sources */, 9E12B0202334696A00ADE5A0 /* FeedlyCreateFeedsForCollectionFoldersOperation.swift in Sources */, @@ -1181,7 +1182,6 @@ 9E964EB823754AC400A7AF2E /* OAuthAuthorizationClient+Feedly.swift in Sources */, 3B3A33E7238D3D6800314204 /* Secrets.swift in Sources */, 9EF1B10923590E93000A486A /* FeedlyStreamIds.swift in Sources */, - 51C034E1242D660D0014DC71 /* CKError+Extensions.swift in Sources */, 84D09623217418DC00D77525 /* FeedbinTagging.swift in Sources */, 84CAD7161FDF2E22000F0755 /* FeedbinEntry.swift in Sources */, 5165D72A22835F7D00D9D53D /* HTMLFeedFinder.swift in Sources */, diff --git a/Frameworks/Account/CloudKit/CKError+Extensions.swift b/Frameworks/Account/CloudKit/CloudKitError.swift similarity index 95% rename from Frameworks/Account/CloudKit/CKError+Extensions.swift rename to Frameworks/Account/CloudKit/CloudKitError.swift index cdce8cdfb..a92a4d167 100644 --- a/Frameworks/Account/CloudKit/CKError+Extensions.swift +++ b/Frameworks/Account/CloudKit/CloudKitError.swift @@ -1,18 +1,29 @@ // -// CKError+Extensions.swift +// CloudKitError.swift // Account // // Created by Maurice Parker on 3/26/20. // Copyright © 2020 Ranchero Software, LLC. All rights reserved. // +// Derived from https://github.com/caiyue1993/IceCream import Foundation import CloudKit -extension CKError: LocalizedError { +class CloudKitError: LocalizedError { + let error: Error + + init(_ error: Error) { + self.error = error + } + public var errorDescription: String? { - switch code { + guard let ckError = error as? CKError else { + return error.localizedDescription + } + + switch ckError.code { case .alreadyShared: return NSLocalizedString("Already Shared: a record or share cannot be saved because doing so would cause the same hierarchy of records to exist in multiple shares.", comment: "Known iCloud Error") case .assetFileModified: diff --git a/Frameworks/Account/CloudKit/CloudKitZone.swift b/Frameworks/Account/CloudKit/CloudKitZone.swift index 0c4f53bf4..fb386713f 100644 --- a/Frameworks/Account/CloudKit/CloudKitZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitZone.swift @@ -110,7 +110,7 @@ extension CloudKitZone { } default: DispatchQueue.main.async { - completion(.failure(error!)) + completion(.failure(CloudKitError(error!))) } } } @@ -145,7 +145,7 @@ extension CloudKitZone { } default: DispatchQueue.main.async { - completion(.failure(error!)) + completion(.failure(CloudKitError(error!))) } } } @@ -180,7 +180,7 @@ extension CloudKitZone { } default: DispatchQueue.main.async { - completion(.failure(error!)) + completion(.failure(CloudKitError(error!))) } } } @@ -271,7 +271,7 @@ extension CloudKitZone { default: DispatchQueue.main.async { - completion(.failure(error!)) + completion(.failure(CloudKitError(error!))) } } } @@ -369,7 +369,7 @@ extension CloudKitZone { } default: DispatchQueue.main.async { - completion(.failure(error!)) + completion(.failure(CloudKitError(error!))) } } @@ -415,7 +415,7 @@ private extension CloudKitZone { database.save(CKRecordZone(zoneID: Self.zoneID)) { (recordZone, error) in if let error = error { DispatchQueue.main.async { - completion(.failure(error)) + completion(.failure(CloudKitError(error))) } } else { DispatchQueue.main.async { diff --git a/Frameworks/Account/CloudKit/CloudKitZoneResult.swift b/Frameworks/Account/CloudKit/CloudKitZoneResult.swift index e37a84ddd..ca1af57c1 100644 --- a/Frameworks/Account/CloudKit/CloudKitZoneResult.swift +++ b/Frameworks/Account/CloudKit/CloudKitZoneResult.swift @@ -33,7 +33,7 @@ enum CloudKitZoneResult { if let retry = ckError.userInfo[CKErrorRetryAfterKey] as? Double { return .retry(afterSeconds: retry) } else { - return .failure(error: error!) + return .failure(error: CloudKitError(ckError)) } case .zoneNotFound: return .zoneNotFound @@ -51,12 +51,12 @@ enum CloudKitZoneResult { return .partialFailure(errors: partialErrors) } } else { - return .failure(error: error!) + return .failure(error: CloudKitError(ckError)) } case .limitExceeded: return .limitExceeded default: - return .failure(error: error!) + return .failure(error: CloudKitError(ckError)) } }