Delete last completion-based method in SyncDatabase.
This commit is contained in:
parent
c50ac0c84b
commit
4a5cb237a0
@ -69,11 +69,8 @@ class CloudKitSendStatusOperation: MainThreadOperation {
|
||||
private extension CloudKitSendStatusOperation {
|
||||
|
||||
func selectForProcessing() {
|
||||
database.selectForProcessing(limit: blockSize) { result in
|
||||
|
||||
MainActor.assumeIsolated {
|
||||
switch result {
|
||||
case .success(let syncStatuses):
|
||||
Task { @MainActor in
|
||||
|
||||
@MainActor func stopProcessing() {
|
||||
if self.showProgress {
|
||||
@ -83,26 +80,25 @@ private extension CloudKitSendStatusOperation {
|
||||
self.operationDelegate?.operationDidComplete(self)
|
||||
}
|
||||
|
||||
guard syncStatuses.count > 0 else {
|
||||
do {
|
||||
guard let syncStatuses = try await self.database.selectForProcessing(limit: blockSize), !syncStatuses.isEmpty else {
|
||||
stopProcessing()
|
||||
return
|
||||
}
|
||||
|
||||
self.processStatuses(syncStatuses) { stop in
|
||||
self.processStatuses(Array(syncStatuses)) { stop in
|
||||
if stop {
|
||||
stopProcessing()
|
||||
} else {
|
||||
self.selectForProcessing()
|
||||
}
|
||||
}
|
||||
|
||||
case .failure(let databaseError):
|
||||
os_log(.error, log: self.log, "Send status error: %@.", databaseError.localizedDescription)
|
||||
} catch {
|
||||
os_log(.error, log: self.log, "Send status error: %@.", error.localizedDescription)
|
||||
self.operationDelegate?.cancelOperation(self)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor func processStatuses(_ syncStatuses: [SyncStatus], completion: @escaping (Bool) -> Void) {
|
||||
guard let account = account, let articlesZone = articlesZone else {
|
||||
|
@ -134,9 +134,12 @@ final class FeedbinAccountDelegate: AccountDelegate {
|
||||
|
||||
os_log(.debug, log: log, "Sending article statuses...")
|
||||
|
||||
database.selectForProcessing { result in
|
||||
Task { @MainActor in
|
||||
|
||||
do {
|
||||
|
||||
let syncStatuses = (try await self.database.selectForProcessing()) ?? Set<SyncStatus>()
|
||||
|
||||
MainActor.assumeIsolated {
|
||||
@MainActor func processStatuses(_ syncStatuses: [SyncStatus]) {
|
||||
let createUnreadStatuses = syncStatuses.filter { $0.key == SyncStatus.Key.read && $0.flag == false }
|
||||
let deleteUnreadStatuses = syncStatuses.filter { $0.key == SyncStatus.Key.read && $0.flag == true }
|
||||
@ -188,12 +191,10 @@ final class FeedbinAccountDelegate: AccountDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
switch result {
|
||||
case .success(let syncStatuses):
|
||||
processStatuses(syncStatuses)
|
||||
case .failure(let databaseError):
|
||||
completion(.failure(databaseError))
|
||||
}
|
||||
processStatuses(Array(syncStatuses))
|
||||
|
||||
} catch {
|
||||
completion(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -28,23 +28,17 @@ final class FeedlySendArticleStatusesOperation: FeedlyOperation {
|
||||
override func run() {
|
||||
os_log(.debug, log: log, "Sending article statuses...")
|
||||
|
||||
database.selectForProcessing { result in
|
||||
MainActor.assumeIsolated {
|
||||
if self.isCanceled {
|
||||
self.didFinish()
|
||||
return
|
||||
}
|
||||
Task { @MainActor in
|
||||
|
||||
switch result {
|
||||
case .success(let syncStatuses):
|
||||
self.processStatuses(syncStatuses)
|
||||
case .failure:
|
||||
do {
|
||||
let syncStatuses = (try await self.database.selectForProcessing()) ?? Set<SyncStatus>()
|
||||
self.processStatuses(Array(syncStatuses))
|
||||
} catch {
|
||||
self.didFinish()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension FeedlySendArticleStatusesOperation {
|
||||
|
||||
|
@ -134,9 +134,10 @@ final class NewsBlurAccountDelegate: AccountDelegate {
|
||||
func sendArticleStatus(for account: Account, completion: @escaping (Result<Void, Error>) -> ()) {
|
||||
os_log(.debug, log: log, "Sending story statuses...")
|
||||
|
||||
database.selectForProcessing { result in
|
||||
Task { @MainActor in
|
||||
|
||||
MainActor.assumeIsolated {
|
||||
do {
|
||||
let syncStatuses = (try await self.database.selectForProcessing()) ?? Set<SyncStatus>()
|
||||
|
||||
@MainActor func processStatuses(_ syncStatuses: [SyncStatus]) {
|
||||
let createUnreadStatuses = syncStatuses.filter {
|
||||
@ -197,12 +198,9 @@ final class NewsBlurAccountDelegate: AccountDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
switch result {
|
||||
case .success(let syncStatuses):
|
||||
processStatuses(syncStatuses)
|
||||
case .failure(let databaseError):
|
||||
completion(.failure(databaseError))
|
||||
}
|
||||
processStatuses(Array(syncStatuses))
|
||||
} catch {
|
||||
completion(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -199,13 +199,17 @@ final class ReaderAPIAccountDelegate: AccountDelegate {
|
||||
}
|
||||
|
||||
func sendArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) {
|
||||
|
||||
os_log(.debug, log: log, "Sending article statuses...")
|
||||
|
||||
database.selectForProcessing { result in
|
||||
Task { @MainActor in
|
||||
|
||||
MainActor.assumeIsolated {
|
||||
do {
|
||||
|
||||
let syncStatuses = (try await self.database.selectForProcessing()) ?? Set<SyncStatus>()
|
||||
|
||||
@MainActor func processStatuses(_ syncStatuses: [SyncStatus]) {
|
||||
|
||||
let createUnreadStatuses = syncStatuses.filter { $0.key == SyncStatus.Key.read && $0.flag == false }
|
||||
let deleteUnreadStatuses = syncStatuses.filter { $0.key == SyncStatus.Key.read && $0.flag == true }
|
||||
let createStarredStatuses = syncStatuses.filter { $0.key == SyncStatus.Key.starred && $0.flag == true }
|
||||
@ -239,12 +243,9 @@ final class ReaderAPIAccountDelegate: AccountDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
switch result {
|
||||
case .success(let syncStatuses):
|
||||
processStatuses(syncStatuses)
|
||||
case .failure(let databaseError):
|
||||
completion(.failure(databaseError))
|
||||
}
|
||||
processStatuses(Array(syncStatuses))
|
||||
} catch {
|
||||
completion(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -110,34 +110,6 @@ public actor SyncDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Compatibility
|
||||
|
||||
// Use the below until switching to the async version of the API.
|
||||
|
||||
public typealias SyncStatusesResult = Result<Array<SyncStatus>, DatabaseError>
|
||||
public typealias SyncStatusesCompletionBlock = @Sendable (SyncStatusesResult) -> Void
|
||||
|
||||
public typealias SyncStatusArticleIDsResult = Result<Set<String>, DatabaseError>
|
||||
public typealias SyncStatusArticleIDsCompletionBlock = @Sendable (SyncStatusArticleIDsResult) -> Void
|
||||
|
||||
public extension SyncDatabase {
|
||||
|
||||
nonisolated func selectForProcessing(limit: Int? = nil, completion: @escaping SyncStatusesCompletionBlock) {
|
||||
|
||||
Task { @MainActor in
|
||||
do {
|
||||
if let syncStatuses = try await self.selectForProcessing(limit: limit) {
|
||||
completion(.success(Array(syncStatuses)))
|
||||
} else {
|
||||
completion(.success([SyncStatus]()))
|
||||
}
|
||||
} catch {
|
||||
completion(.failure(DatabaseError.suspended))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension SyncDatabase {
|
||||
|
||||
static let creationStatements = """
|
||||
|
Loading…
x
Reference in New Issue
Block a user