diff --git a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift index 440eb2076..d448bbdec 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift @@ -465,7 +465,9 @@ final class CloudKitAccountDelegate: AccountDelegate { let syncStatuses = articles.map { article in return SyncStatus(articleID: article.articleID, key: SyncStatus.Key(statusKey), flag: flag) } - database.insertStatuses(syncStatuses) + + try? database.insertStatuses(syncStatuses) + let articles = try? account.update(articles, statusKey: statusKey, flag: flag) database.selectPendingCount { result in if let count = try? result.get(), count > 100 { @@ -473,7 +475,7 @@ final class CloudKitAccountDelegate: AccountDelegate { } } - return try? account.update(articles, statusKey: statusKey, flag: flag) + return articles } func accountDidInitialize(_ account: Account) { @@ -636,10 +638,9 @@ private extension CloudKitAccountDelegate { account.update(webFeed.webFeedID, with: parsedItems) { result in switch result { case .success(let articleChanges): - self.storeArticleChanges(new: articleChanges.newArticles, updated: articleChanges.updatedArticles, deleted: articleChanges.deletedArticles) { - self.refreshProgress.completeTask() - group.leave() - } + self.storeArticleChanges(new: articleChanges.newArticles, updated: articleChanges.updatedArticles, deleted: articleChanges.deletedArticles) + self.refreshProgress.completeTask() + group.leave() case .failure(let error): os_log(.error, log: self.log, "CloudKit Feed refresh update error: %@.", error.localizedDescription) self.refreshProgress.completeTask() @@ -661,9 +662,8 @@ private extension CloudKitAccountDelegate { group.enter() refresher.refreshFeeds(refresherWebFeeds) { refresherNewArticles, refresherUpdatedArticles, refresherDeletedArticles in - self.storeArticleChanges(new: refresherNewArticles, updated: refresherUpdatedArticles, deleted: refresherDeletedArticles) { - group.leave() - } + self.storeArticleChanges(new: refresherNewArticles, updated: refresherUpdatedArticles, deleted: refresherDeletedArticles) + group.leave() } group.notify(queue: DispatchQueue.main) { @@ -811,18 +811,17 @@ private extension CloudKitAccountDelegate { account.fetchArticlesAsync(.webFeed(feed)) { result in switch result { case .success(let articles): - self.storeArticleChanges(new: articles, updated: Set
(), deleted: Set
()) { - self.sendArticleStatus(for: account) { result in - switch result { - case .success: - self.articlesZone.fetchChangesInZone() { _ in - self.refreshProgress.clear() - completion(.success(feed)) - } - case .failure(let error): + self.storeArticleChanges(new: articles, updated: Set
(), deleted: Set
()) + self.sendArticleStatus(for: account) { result in + switch result { + case .success: + self.articlesZone.fetchChangesInZone() { _ in self.refreshProgress.clear() - completion(.failure(error)) + completion(.success(feed)) } + case .failure(let error): + self.refreshProgress.clear() + completion(.failure(error)) } } case .failure(let error): @@ -841,40 +840,20 @@ private extension CloudKitAccountDelegate { } } - func storeArticleChanges(new: Set
?, updated: Set
?, deleted: Set
?, completion: @escaping () -> Void) { - let group = DispatchGroup() - - group.enter() - insertSyncStatuses(articles: new, statusKey: .new, flag: true) { - group.leave() - } - - group.enter() - insertSyncStatuses(articles: updated, statusKey: .new, flag: false) { - group.leave() - } - - group.enter() - insertSyncStatuses(articles: deleted, statusKey: .deleted, flag: true) { - group.leave() - } - - group.notify(queue: DispatchQueue.main) { - completion() - } + func storeArticleChanges(new: Set
?, updated: Set
?, deleted: Set
?) { + insertSyncStatuses(articles: new, statusKey: .new, flag: true) + insertSyncStatuses(articles: updated, statusKey: .new, flag: false) + insertSyncStatuses(articles: deleted, statusKey: .deleted, flag: true) } - func insertSyncStatuses(articles: Set
?, statusKey: SyncStatus.Key, flag: Bool, completion: @escaping () -> Void) { + func insertSyncStatuses(articles: Set
?, statusKey: SyncStatus.Key, flag: Bool) { guard let articles = articles else { - completion() return } let syncStatuses = articles.map { article in return SyncStatus(articleID: article.articleID, key: statusKey, flag: flag) } - database.insertStatuses(syncStatuses) { _ in - completion() - } + try? database.insertStatuses(syncStatuses) } } diff --git a/Frameworks/Account/FeedWrangler/FeedWranglerAccountDelegate.swift b/Frameworks/Account/FeedWrangler/FeedWranglerAccountDelegate.swift index 9ae70a87f..7876f4ceb 100644 --- a/Frameworks/Account/FeedWrangler/FeedWranglerAccountDelegate.swift +++ b/Frameworks/Account/FeedWrangler/FeedWranglerAccountDelegate.swift @@ -437,7 +437,7 @@ final class FeedWranglerAccountDelegate: AccountDelegate { func markArticles(for account: Account, articles: Set
, statusKey: ArticleStatus.Key, flag: Bool) -> Set
? { let syncStatuses = articles.map { SyncStatus(articleID: $0.articleID, key: SyncStatus.Key(statusKey), flag: flag)} - database.insertStatuses(syncStatuses) + try? database.insertStatuses(syncStatuses) database.selectPendingCount { result in if let count = try? result.get(), count > 0 { diff --git a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift index 575848806..f6feb8a34 100644 --- a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift +++ b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift @@ -539,7 +539,7 @@ final class FeedbinAccountDelegate: AccountDelegate { let syncStatuses = articles.map { article in return SyncStatus(articleID: article.articleID, key: SyncStatus.Key(statusKey), flag: flag) } - database.insertStatuses(syncStatuses) + try? database.insertStatuses(syncStatuses) database.selectPendingCount { result in if let count = try? result.get(), count > 100 { diff --git a/Frameworks/Account/Feedly/FeedlyAccountDelegate.swift b/Frameworks/Account/Feedly/FeedlyAccountDelegate.swift index 9390f493d..0ef73d556 100644 --- a/Frameworks/Account/Feedly/FeedlyAccountDelegate.swift +++ b/Frameworks/Account/Feedly/FeedlyAccountDelegate.swift @@ -492,7 +492,7 @@ final class FeedlyAccountDelegate: AccountDelegate { return SyncStatus(articleID: article.articleID, key: SyncStatus.Key(statusKey), flag: flag) } - database.insertStatuses(syncStatuses) + try? database.insertStatuses(syncStatuses) os_log(.debug, log: log, "Marking %@ as %@.", articles.map { $0.title }, syncStatuses) database.selectPendingCount { result in diff --git a/Frameworks/Account/NewsBlur/NewsBlurAccountDelegate.swift b/Frameworks/Account/NewsBlur/NewsBlurAccountDelegate.swift index 638d3559a..02c0f16d2 100644 --- a/Frameworks/Account/NewsBlur/NewsBlurAccountDelegate.swift +++ b/Frameworks/Account/NewsBlur/NewsBlurAccountDelegate.swift @@ -577,7 +577,7 @@ final class NewsBlurAccountDelegate: AccountDelegate { let syncStatuses = articles.map { article in return SyncStatus(articleID: article.articleID, key: SyncStatus.Key(statusKey), flag: flag) } - database.insertStatuses(syncStatuses) + try? database.insertStatuses(syncStatuses) database.selectPendingCount { result in if let count = try? result.get(), count > 100 { diff --git a/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift b/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift index a4bc9f062..117cc3daa 100644 --- a/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift +++ b/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift @@ -414,7 +414,7 @@ final class ReaderAPIAccountDelegate: AccountDelegate { let syncStatuses = articles.map { article in return SyncStatus(articleID: article.articleID, key: SyncStatus.Key(statusKey), flag: flag) } - database.insertStatuses(syncStatuses) + try? database.insertStatuses(syncStatuses) database.selectPendingCount { result in if let count = try? result.get(), count > 100 { diff --git a/Frameworks/SyncDatabase/SyncDatabase.swift b/Frameworks/SyncDatabase/SyncDatabase.swift index c5fcccd70..4c2c04aec 100644 --- a/Frameworks/SyncDatabase/SyncDatabase.swift +++ b/Frameworks/SyncDatabase/SyncDatabase.swift @@ -32,8 +32,8 @@ public struct SyncDatabase { // MARK: - API - public func insertStatuses(_ statuses: [SyncStatus], completion: DatabaseCompletionBlock? = nil) { - syncStatusTable.insertStatuses(statuses, completion: completion) + public func insertStatuses(_ statuses: [SyncStatus]) throws { + try syncStatusTable.insertStatuses(statuses) } public func selectForProcessing(completion: @escaping SyncStatusesCompletionBlock) { diff --git a/Frameworks/SyncDatabase/SyncStatusTable.swift b/Frameworks/SyncDatabase/SyncStatusTable.swift index 3bda3c86d..138c769c0 100644 --- a/Frameworks/SyncDatabase/SyncStatusTable.swift +++ b/Frameworks/SyncDatabase/SyncStatusTable.swift @@ -149,22 +149,21 @@ struct SyncStatusTable: DatabaseTable { } } - func insertStatuses(_ statuses: [SyncStatus], completion: DatabaseCompletionBlock? = nil) { - queue.runInTransaction { databaseResult in - - func makeDatabaseCall(_ database: FMDatabase) { - let statusArray = statuses.map { $0.databaseDictionary() } - self.insertRows(statusArray, insertType: .orReplace, in: database) - } - + func insertStatuses(_ statuses: [SyncStatus]) throws { + var error: DatabaseError? + queue.runInTransactionSync { databaseResult in switch databaseResult { case .success(let database): - makeDatabaseCall(database) - callCompletion(completion, nil) + let statusArray = statuses.map { $0.databaseDictionary() } + self.insertRows(statusArray, insertType: .orReplace, in: database) case .failure(let databaseError): - callCompletion(completion, databaseError) + error = databaseError } } + + if let error = error { + throw error + } } }