Remove app state from background tasks

This commit is contained in:
Marcin Czachurski 2023-10-25 08:36:04 +02:00
parent 9be8a36b1c
commit af0bb99ce3
4 changed files with 30 additions and 34 deletions

View File

@ -24,20 +24,24 @@ public class HomeTimelineService {
private let imagePrefetcher = ImagePrefetcher(destination: .diskCache) private let imagePrefetcher = ImagePrefetcher(destination: .diskCache)
private let semaphore = AsyncSemaphore(value: 1) private let semaphore = AsyncSemaphore(value: 1)
public func amountOfNewStatuses(for account: AccountModel, includeReblogs: Bool, hideStatusesWithoutAlt: Bool, modelContext: ModelContext) async -> Int { public func amountOfNewStatuses(includeReblogs: Bool, hideStatusesWithoutAlt: Bool, modelContext: ModelContext) async -> Int {
await semaphore.wait() await semaphore.wait()
defer { semaphore.signal() } defer { semaphore.signal() }
guard let accessToken = account.accessToken else { guard let accountData = AccountDataHandler.shared.getCurrentAccountData(modelContext: modelContext) else {
return 0
}
guard let accessToken = accountData.accessToken else {
return 0 return 0
} }
// Get maximimum downloaded stauts id. // Get maximimum downloaded stauts id.
guard let lastSeenStatusId = self.getLastLoadedStatusId(accountId: account.id, modelContext: modelContext) else { guard let lastSeenStatusId = self.getLastLoadedStatusId(accountId: accountData.id, modelContext: modelContext) else {
return 0 return 0
} }
let client = PixelfedClient(baseURL: account.serverUrl).getAuthenticated(token: accessToken) let client = PixelfedClient(baseURL: accountData.serverUrl).getAuthenticated(token: accessToken)
var statuses: [Status] = [] var statuses: [Status] = []
var newestStatusId = lastSeenStatusId var newestStatusId = lastSeenStatusId
@ -52,7 +56,7 @@ public class HomeTimelineService {
break break
} }
let visibleStatuses = self.getVisibleStatuses(accountId: account.id, let visibleStatuses = self.getVisibleStatuses(accountId: accountData.id,
statuses: downloadedStatuses, statuses: downloadedStatuses,
hideStatusesWithoutAlt: hideStatusesWithoutAlt, hideStatusesWithoutAlt: hideStatusesWithoutAlt,
modelContext: modelContext) modelContext: modelContext)

View File

@ -47,20 +47,24 @@ public class NotificationsService {
} }
} }
public func amountOfNewNotifications(for account: AccountModel, modelContext: ModelContext) async -> Int { public func amountOfNewNotifications(modelContext: ModelContext) async -> Int {
await semaphore.wait() await semaphore.wait()
defer { semaphore.signal() } defer { semaphore.signal() }
guard let accessToken = account.accessToken else { guard let accountData = AccountDataHandler.shared.getCurrentAccountData(modelContext: modelContext) else {
return 0
}
guard let accessToken = accountData.accessToken else {
return 0 return 0
} }
// Get maximimum downloaded stauts id. // Get maximimum downloaded stauts id.
guard let lastSeenNotificationId = self.getLastSeenNotificationId(accountId: account.id, modelContext: modelContext) else { guard let lastSeenNotificationId = self.getLastSeenNotificationId(accountId: accountData.id, modelContext: modelContext) else {
return 0 return 0
} }
let client = PixelfedClient(baseURL: account.serverUrl).getAuthenticated(token: accessToken) let client = PixelfedClient(baseURL: accountData.serverUrl).getAuthenticated(token: accessToken)
var notifications: [PixelfedKit.Notification] = [] var notifications: [PixelfedKit.Notification] = []
var maxId: String? = nil var maxId: String? = nil
var allItemsProcessed = false var allItemsProcessed = false

View File

@ -226,28 +226,21 @@ struct VernissageApp: App {
private func calculateNewPhotosInBackground() async { private func calculateNewPhotosInBackground() async {
let modelContext = self.modelContainer.mainContext let modelContext = self.modelContainer.mainContext
if let account = self.applicationState.account { self.applicationState.amountOfNewStatuses = await HomeTimelineService.shared.amountOfNewStatuses(
self.applicationState.amountOfNewStatuses = await HomeTimelineService.shared.amountOfNewStatuses( includeReblogs: self.applicationState.showReboostedStatuses,
for: account, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt,
includeReblogs: self.applicationState.showReboostedStatuses, modelContext: modelContext
hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, )
modelContext: modelContext
)
}
} }
private func calculateNewNotificationsInBackground() async { private func calculateNewNotificationsInBackground() async {
Logger.main.info("Calculating new notifications started.") Logger.main.info("Calculating new notifications started.")
let modelContext = self.modelContainer.mainContext let modelContext = self.modelContainer.mainContext
let amountOfNewNotifications = await NotificationsService.shared.amountOfNewNotifications(modelContext: modelContext)
self.applicationState.amountOfNewNotifications = amountOfNewNotifications
var amountOfNewNotifications = 0
if let account = self.applicationState.account {
amountOfNewNotifications = await NotificationsService.shared.amountOfNewNotifications(for: account, modelContext: modelContext)
}
do { do {
self.applicationState.amountOfNewNotifications = amountOfNewNotifications
try await NotificationsService.shared.setBadgeCount(amountOfNewNotifications, modelContext: modelContext) try await NotificationsService.shared.setBadgeCount(amountOfNewNotifications, modelContext: modelContext)
Logger.main.info("New notifications (\(amountOfNewNotifications)) calculated successfully.") Logger.main.info("New notifications (\(amountOfNewNotifications)) calculated successfully.")
} catch { } catch {

View File

@ -337,19 +337,14 @@ struct MainView: View {
} }
private func calculateNewPhotosInBackground() async { private func calculateNewPhotosInBackground() async {
if let account = self.applicationState.account { self.applicationState.amountOfNewStatuses = await HomeTimelineService.shared.amountOfNewStatuses(
self.applicationState.amountOfNewStatuses = await HomeTimelineService.shared.amountOfNewStatuses( includeReblogs: self.applicationState.showReboostedStatuses,
for: account, hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt,
includeReblogs: self.applicationState.showReboostedStatuses, modelContext: modelContext
hideStatusesWithoutAlt: self.applicationState.hideStatusesWithoutAlt, )
modelContext: modelContext
)
}
} }
private func calculateNewNotificationsInBackground() async { private func calculateNewNotificationsInBackground() async {
if let account = self.applicationState.account { self.applicationState.amountOfNewNotifications = await NotificationsService.shared.amountOfNewNotifications(modelContext: modelContext)
self.applicationState.amountOfNewNotifications = await NotificationsService.shared.amountOfNewNotifications(for: account, modelContext: modelContext)
}
} }
} }