diff --git a/Account/Sources/Account/Account.swift b/Account/Sources/Account/Account.swift index 5ca4a615a..4245ec84c 100644 --- a/Account/Sources/Account/Account.swift +++ b/Account/Sources/Account/Account.swift @@ -754,8 +754,9 @@ public enum FetchType { try await database.unreadArticleIDs() } - public func fetchStarredArticleIDs(_ completion: @escaping ArticleIDsCompletionBlock) { - database.fetchStarredArticleIDsAsync(completion: completion) + public func fetchStarredArticleIDs() async throws -> Set? { + + try await database.starredArticleIDs() } /// Fetch articleIDs for articles that we should have, but don’t. These articles are either (starred) or (newer than the article cutoff date). diff --git a/Account/Sources/Account/Feedbin/FeedbinAccountDelegate.swift b/Account/Sources/Account/Feedbin/FeedbinAccountDelegate.swift index 5cf373ec1..8a366ac9f 100644 --- a/Account/Sources/Account/Feedbin/FeedbinAccountDelegate.swift +++ b/Account/Sources/Account/Feedbin/FeedbinAccountDelegate.swift @@ -1550,42 +1550,33 @@ private extension FeedbinAccountDelegate { do { let pendingArticleIDs = (try await self.database.selectPendingStarredStatusArticleIDs()) ?? Set() - @MainActor func process(_ pendingArticleIDs: Set) { + let feedbinStarredArticleIDs = Set(articleIDs.map { String($0) } ) + let updatableFeedbinStarredArticleIDs = feedbinStarredArticleIDs.subtracting(pendingArticleIDs) - let feedbinStarredArticleIDs = Set(articleIDs.map { String($0) } ) - let updatableFeedbinStarredArticleIDs = feedbinStarredArticleIDs.subtracting(pendingArticleIDs) - - account.fetchStarredArticleIDs { articleIDsResult in - - MainActor.assumeIsolated { - guard let currentStarredArticleIDs = try? articleIDsResult.get() else { - return - } - - let group = DispatchGroup() - - // Mark articles as starred - let deltaStarredArticleIDs = updatableFeedbinStarredArticleIDs.subtracting(currentStarredArticleIDs) - group.enter() - account.markAsStarred(deltaStarredArticleIDs) { _ in - group.leave() - } - - // Mark articles as unstarred - let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableFeedbinStarredArticleIDs) - group.enter() - account.markAsUnstarred(deltaUnstarredArticleIDs) { _ in - group.leave() - } - - group.notify(queue: DispatchQueue.main) { - completion() - } - } - } + guard let currentStarredArticleIDs = try await account.fetchStarredArticleIDs() else { + completion() + return } - process(pendingArticleIDs) + let group = DispatchGroup() + + // Mark articles as starred + let deltaStarredArticleIDs = updatableFeedbinStarredArticleIDs.subtracting(currentStarredArticleIDs) + group.enter() + account.markAsStarred(deltaStarredArticleIDs) { _ in + group.leave() + } + + // Mark articles as unstarred + let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableFeedbinStarredArticleIDs) + group.enter() + account.markAsUnstarred(deltaUnstarredArticleIDs) { _ in + group.leave() + } + + group.notify(queue: DispatchQueue.main) { + completion() + } } catch { os_log(.error, log: self.log, "Sync Article Starred Status failed: %@.", error.localizedDescription) diff --git a/Account/Sources/Account/Feedly/Operations/FeedlyIngestStarredArticleIdsOperation.swift b/Account/Sources/Account/Feedly/Operations/FeedlyIngestStarredArticleIdsOperation.swift index 1a51b090b..8d6c4340d 100644 --- a/Account/Sources/Account/Feedly/Operations/FeedlyIngestStarredArticleIdsOperation.swift +++ b/Account/Sources/Account/Feedly/Operations/FeedlyIngestStarredArticleIdsOperation.swift @@ -95,20 +95,19 @@ final class FeedlyIngestStarredArticleIdsOperation: FeedlyOperation { didFinish() return } - - account.fetchStarredArticleIDs { result in - MainActor.assumeIsolated { - switch result { - case .success(let localStarredArticleIDs): - self.processStarredArticleIDs(localStarredArticleIDs) - case .failure(let error): - self.didFinish(with: error) + Task { @MainActor in + + do { + if let localStarredArticleIDs = try await account.fetchStarredArticleIDs() { + self.processStarredArticleIDs(localStarredArticleIDs) } + } catch { + self.didFinish(with: error) } } } - + func processStarredArticleIDs(_ localStarredArticleIDs: Set) { guard !isCanceled else { didFinish() diff --git a/Account/Sources/Account/NewsBlur/Internals/NewsBlurAccountDelegate+Internal.swift b/Account/Sources/Account/NewsBlur/Internals/NewsBlurAccountDelegate+Internal.swift index 12c524635..3bbf4a51f 100644 --- a/Account/Sources/Account/NewsBlur/Internals/NewsBlurAccountDelegate+Internal.swift +++ b/Account/Sources/Account/NewsBlur/Internals/NewsBlurAccountDelegate+Internal.swift @@ -378,42 +378,33 @@ extension NewsBlurAccountDelegate { do { let pendingArticleIDs = (try await database.selectPendingStarredStatusArticleIDs()) ?? Set() - @MainActor func process(_ pendingStoryHashes: Set) { + let newsBlurStarredStoryHashes = Set(hashes.map { $0.hash } ) + let updatableNewsBlurUnreadStoryHashes = newsBlurStarredStoryHashes.subtracting(pendingArticleIDs) - let newsBlurStarredStoryHashes = Set(hashes.map { $0.hash } ) - let updatableNewsBlurUnreadStoryHashes = newsBlurStarredStoryHashes.subtracting(pendingStoryHashes) - - account.fetchStarredArticleIDs { articleIDsResult in - MainActor.assumeIsolated { - guard let currentStarredArticleIDs = try? articleIDsResult.get() else { - return - } - - let group = DispatchGroup() - - // Mark articles as starred - let deltaStarredArticleIDs = updatableNewsBlurUnreadStoryHashes.subtracting(currentStarredArticleIDs) - group.enter() - account.markAsStarred(deltaStarredArticleIDs) { _ in - group.leave() - } - - // Mark articles as unstarred - let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableNewsBlurUnreadStoryHashes) - group.enter() - account.markAsUnstarred(deltaUnstarredArticleIDs) { _ in - group.leave() - } - - group.notify(queue: DispatchQueue.main) { - completion() - } - } - } + guard let currentStarredArticleIDs = try await account.fetchStarredArticleIDs() else { + completion() + return } - process(pendingArticleIDs) + let group = DispatchGroup() + // Mark articles as starred + let deltaStarredArticleIDs = updatableNewsBlurUnreadStoryHashes.subtracting(currentStarredArticleIDs) + group.enter() + account.markAsStarred(deltaStarredArticleIDs) { _ in + group.leave() + } + + // Mark articles as unstarred + let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableNewsBlurUnreadStoryHashes) + group.enter() + account.markAsUnstarred(deltaUnstarredArticleIDs) { _ in + group.leave() + } + + group.notify(queue: DispatchQueue.main) { + completion() + } } catch { os_log(.error, log: self.log, "Sync Story Starred Status failed: %@.", error.localizedDescription) } diff --git a/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift b/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift index a785e55ad..eb04caa43 100644 --- a/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift +++ b/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift @@ -1352,41 +1352,32 @@ private extension ReaderAPIAccountDelegate { let pendingArticleIDs = (try await self.database.selectPendingStarredStatusArticleIDs()) ?? Set() - @MainActor func process(_ pendingArticleIDs: Set) { - let updatableReaderUnreadArticleIDs = Set(articleIDs).subtracting(pendingArticleIDs) + let updatableReaderUnreadArticleIDs = Set(articleIDs).subtracting(pendingArticleIDs) - account.fetchStarredArticleIDs { articleIDsResult in - - MainActor.assumeIsolated { - guard let currentStarredArticleIDs = try? articleIDsResult.get() else { - return - } - - let group = DispatchGroup() - - // Mark articles as starred - let deltaStarredArticleIDs = updatableReaderUnreadArticleIDs.subtracting(currentStarredArticleIDs) - group.enter() - account.markAsStarred(deltaStarredArticleIDs) { _ in - group.leave() - } - - // Mark articles as unstarred - let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableReaderUnreadArticleIDs) - group.enter() - account.markAsUnstarred(deltaUnstarredArticleIDs) { _ in - group.leave() - } - - group.notify(queue: DispatchQueue.main) { - completion() - } - } - } + guard let currentStarredArticleIDs = try await account.fetchStarredArticleIDs() else { + completion() + return } - process(pendingArticleIDs) + let group = DispatchGroup() + // Mark articles as starred + let deltaStarredArticleIDs = updatableReaderUnreadArticleIDs.subtracting(currentStarredArticleIDs) + group.enter() + account.markAsStarred(deltaStarredArticleIDs) { _ in + group.leave() + } + + // Mark articles as unstarred + let deltaUnstarredArticleIDs = currentStarredArticleIDs.subtracting(updatableReaderUnreadArticleIDs) + group.enter() + account.markAsUnstarred(deltaUnstarredArticleIDs) { _ in + group.leave() + } + + group.notify(queue: DispatchQueue.main) { + completion() + } } catch { os_log(.error, log: self.log, "Sync Article Starred Status failed: %@.", error.localizedDescription) }