Convert some FeedbinAPICaller methods to async await.

This commit is contained in:
Brent Simmons 2024-04-08 14:14:07 -07:00
parent 4ad43b5b9a
commit 3771f58013
2 changed files with 67 additions and 92 deletions

View File

@ -394,16 +394,16 @@ final class FeedbinAccountDelegate: AccountDelegate {
if let feedTaggingID = feed.folderRelationship?[folder.name ?? ""] {
group.enter()
refreshProgress.addToNumberOfTasksAndRemaining(1)
caller.deleteTagging(taggingID: feedTaggingID) { result in
self.refreshProgress.completeTask()
group.leave()
switch result {
case .success:
DispatchQueue.main.async {
self.clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
}
case .failure(let error):
Task { @MainActor in
do {
try await caller.deleteTagging(taggingID: feedTaggingID)
self.clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
group.leave()
} catch {
os_log(.error, log: self.log, "Remove feed error: %@.", error.localizedDescription)
group.leave()
}
}
}
@ -413,23 +413,19 @@ final class FeedbinAccountDelegate: AccountDelegate {
if let subscriptionID = feed.externalID {
group.enter()
refreshProgress.addToNumberOfTasksAndRemaining(1)
caller.deleteSubscription(subscriptionID: subscriptionID) { result in
self.refreshProgress.completeTask()
group.leave()
switch result {
case .success:
DispatchQueue.main.async {
account.clearFeedMetadata(feed)
}
case .failure(let error):
Task { @MainActor in
do {
try await caller.deleteSubscription(subscriptionID: subscriptionID)
account.clearFeedMetadata(feed)
} catch {
os_log(.error, log: self.log, "Remove feed error: %@.", error.localizedDescription)
}
self.refreshProgress.completeTask()
group.leave()
}
}
}
}
group.notify(queue: DispatchQueue.main) {
@ -1499,24 +1495,23 @@ private extension FeedbinAccountDelegate {
}
func deleteTagging(for account: Account, with feed: Feed, from container: Container?, completion: @escaping (Result<Void, Error>) -> Void) {
if let folder = container as? Folder, let feedTaggingID = feed.folderRelationship?[folder.name ?? ""] {
refreshProgress.addToNumberOfTasksAndRemaining(1)
caller.deleteTagging(taggingID: feedTaggingID) { result in
self.refreshProgress.completeTask()
switch result {
case .success:
DispatchQueue.main.async {
self.clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
folder.removeFeed(feed)
account.addFeedIfNotInAnyFolder(feed)
completion(.success(()))
}
case .failure(let error):
DispatchQueue.main.async {
let wrappedError = AccountError.wrappedError(error: error, account: account)
completion(.failure(wrappedError))
}
Task { @MainActor in
do {
try await caller.deleteTagging(taggingID: feedTaggingID)
self.clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
folder.removeFeed(feed)
account.addFeedIfNotInAnyFolder(feed)
completion(.success(()))
} catch {
let wrappedError = AccountError.wrappedError(error: error, account: account)
completion(.failure(wrappedError))
}
}
} else {
@ -1525,7 +1520,6 @@ private extension FeedbinAccountDelegate {
}
completion(.success(()))
}
}
func deleteSubscription(for account: Account, with feed: Feed, from container: Container?, completion: @escaping (Result<Void, Error>) -> Void) {
@ -1537,28 +1531,25 @@ private extension FeedbinAccountDelegate {
}
refreshProgress.addToNumberOfTasksAndRemaining(1)
caller.deleteSubscription(subscriptionID: subscriptionID) { result in
self.refreshProgress.completeTask()
switch result {
case .success:
DispatchQueue.main.async {
account.clearFeedMetadata(feed)
account.removeFeed(feed)
if let folders = account.folders {
for folder in folders {
folder.removeFeed(feed)
}
Task { @MainActor in
do {
try await caller.deleteSubscription(subscriptionID: subscriptionID)
account.clearFeedMetadata(feed)
account.removeFeed(feed)
if let folders = account.folders {
for folder in folders {
folder.removeFeed(feed)
}
completion(.success(()))
}
case .failure(let error):
DispatchQueue.main.async {
let wrappedError = AccountError.wrappedError(error: error, account: account)
completion(.failure(wrappedError))
}
completion(.success(()))
} catch {
let wrappedError = AccountError.wrappedError(error: error, account: account)
completion(.failure(wrappedError))
}
}
}
}

View File

@ -23,7 +23,7 @@ enum CreateSubscriptionResult {
}
final class FeedbinAPICaller: NSObject {
struct ConditionalGetKeys {
static let subscriptions = "subscriptions"
static let tags = "tags"
@ -101,6 +101,8 @@ final class FeedbinAPICaller: NSObject {
func retrieveTags() async throws -> [FeedbinTag]? {
if suspended { throw TransportError.suspended }
let callURL = feedbinBaseURL.appendingPathComponent("tags.json")
let conditionalGet = accountMetadata?.conditionalGetInfo[ConditionalGetKeys.tags]
let request = URLRequest(url: callURL, credentials: credentials, conditionalGet: conditionalGet)
@ -118,10 +120,6 @@ final class FeedbinAPICaller: NSObject {
let payload = FeedbinRenameTag(oldName: oldName, newName: newName)
transport.send(request: request, method: HTTPMethod.post, payload: payload) { result in
if self.suspended {
completion(.failure(TransportError.suspended))
return
}
switch result {
case .success:
@ -246,26 +244,20 @@ final class FeedbinAPICaller: NSObject {
}
}
func deleteSubscription(subscriptionID: String, completion: @escaping (Result<Void, Error>) -> Void) {
func deleteSubscription(subscriptionID: String) async throws {
if suspended { throw TransportError.suspended }
let callURL = feedbinBaseURL.appendingPathComponent("subscriptions/\(subscriptionID).json")
let request = URLRequest(url: callURL, credentials: credentials)
transport.send(request: request, method: HTTPMethod.delete) { result in
if self.suspended {
completion(.failure(TransportError.suspended))
return
}
switch result {
case .success:
completion(.success(()))
case .failure(let error):
completion(.failure(error))
}
}
try await transport.send(request: request, method: HTTPMethod.delete)
}
func retrieveTaggings() async throws -> [FeedbinTagging]? {
if suspended { throw TransportError.suspended }
let callURL = feedbinBaseURL.appendingPathComponent("taggings.json")
let conditionalGet = accountMetadata?.conditionalGetInfo[ConditionalGetKeys.taggings]
let request = URLRequest(url: callURL, credentials: credentials, conditionalGet: conditionalGet)
@ -316,25 +308,17 @@ final class FeedbinAPICaller: NSObject {
}
func deleteTagging(taggingID: String, completion: @escaping (Result<Void, Error>) -> Void) {
func deleteTagging(taggingID: String) async throws {
if suspended { throw TransportError.suspended }
let callURL = feedbinBaseURL.appendingPathComponent("taggings/\(taggingID).json")
var request = URLRequest(url: callURL, credentials: credentials)
request.addValue("application/json; charset=utf-8", forHTTPHeaderField: HTTPRequestHeader.contentType)
transport.send(request: request, method: HTTPMethod.delete) { result in
if self.suspended {
completion(.failure(TransportError.suspended))
return
}
switch result {
case .success:
completion(.success(()))
case .failure(let error):
completion(.failure(error))
}
}
try await transport.send(request: request, method: HTTPMethod.delete)
}
func retrieveEntries(articleIDs: [String], completion: @escaping (Result<([FeedbinEntry]?), Error>) -> Void) {
guard !articleIDs.isEmpty else {
@ -625,7 +609,7 @@ final class FeedbinAPICaller: NSObject {
// MARK: Private
extension FeedbinAPICaller {
private extension FeedbinAPICaller {
func storeConditionalGet(key: String, headers: [AnyHashable : Any]) {
if var conditionalGet = accountMetadata?.conditionalGetInfo {