2
2
mirror of https://github.com/mastodon/mastodon-ios synced 2025-04-11 22:58:02 +02:00

MainActor for the new PersistenceManager

This commit is contained in:
shannon 2024-11-15 14:45:37 -05:00
parent d1ac4e8796
commit d7f473c892
6 changed files with 11 additions and 13 deletions

View File

@ -261,7 +261,7 @@ extension SettingsCoordinator: NotificationSettingsViewControllerDelegate {
extension SettingsCoordinator: PolicySelectionViewControllerDelegate {
func newPolicySelected(_ viewController: PolicySelectionViewController, newPolicy: NotificationPolicy) {
self.setting.activeSubscription?.policyRaw = newPolicy.subscriptionPolicy.rawValue
try? PersistenceManager.shared.managedObjectContext.save()
try? PersistenceManager.shared.mainActorManagedObjectContext.save()
}
}

View File

@ -78,7 +78,7 @@ extension ThreadViewModel {
newSnapshot.appendSections([.main])
// top loader
let _hasReplyTo: Bool? = try? await PersistenceManager.shared.managedObjectContext.perform {
let _hasReplyTo: Bool? = try? await PersistenceManager.shared.mainActorManagedObjectContext.perform {
guard case let .root(threadContext) = root else { return nil }
return threadContext.status.entity.inReplyToID != nil
}

View File

@ -12,10 +12,11 @@ import CoreData
import CoreDataStack
import AlamofireImage
@MainActor
public class PersistenceManager {
public static let shared = { PersistenceManager() }()
public let coreDataStack: CoreDataStack
public let managedObjectContext: NSManagedObjectContext
public let mainActorManagedObjectContext: NSManagedObjectContext
public let backgroundManagedObjectContext: NSManagedObjectContext
private var disposeBag = Set<AnyCancellable>()
@ -26,15 +27,15 @@ public class PersistenceManager {
let _backgroundManagedObjectContext = _coreDataStack.persistentContainer.newBackgroundContext()
coreDataStack = _coreDataStack
managedObjectContext = _managedObjectContext
mainActorManagedObjectContext = _managedObjectContext
backgroundManagedObjectContext = _backgroundManagedObjectContext
backgroundManagedObjectContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave, object: backgroundManagedObjectContext)
.sink { [weak self] notification in
guard let self = self else { return }
self.managedObjectContext.perform {
self.managedObjectContext.mergeChanges(fromContextDidSave: notification)
self.mainActorManagedObjectContext.perform {
self.mainActorManagedObjectContext.mergeChanges(fromContextDidSave: notification)
}
}
.store(in: &disposeBag)
@ -60,9 +61,6 @@ public class AppContext: ObservableObject {
.eraseToAnyPublisher()
private init() {
let authProvider = AuthenticationServiceProvider.shared
documentStore = DocumentStore()
documentStoreSubscription = documentStore.objectWillChange
.receive(on: DispatchQueue.main)

View File

@ -53,7 +53,7 @@ public class AuthenticationServiceProvider: ObservableObject {
Task {
if authenticationMigrationRequired {
migrateLegacyAuthentications(
in: PersistenceManager.shared.managedObjectContext
in: PersistenceManager.shared.mainActorManagedObjectContext
)
}
}

View File

@ -29,7 +29,7 @@ public final class SettingFetchedResultController: NSObject {
fetchRequest.fetchBatchSize = 20
let controller = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: PersistenceManager.shared.managedObjectContext,
managedObjectContext: PersistenceManager.shared.mainActorManagedObjectContext,
sectionNameKeyPath: nil,
cacheName: nil
)

View File

@ -183,7 +183,7 @@ extension NotificationService {
) async throws {
// Subscription maybe failed to cancel when sign-out
// Try cancel again if receive that kind push notification
let managedObjectContext = PersistenceManager.shared.managedObjectContext
let managedObjectContext = PersistenceManager.shared.mainActorManagedObjectContext
let userAccessToken = pushNotification.accessToken
@ -209,7 +209,7 @@ extension NotificationService {
}
private func domain(for pushNotification: MastodonPushNotification) async throws -> String? {
let managedObjectContext = PersistenceManager.shared.managedObjectContext
let managedObjectContext = PersistenceManager.shared.mainActorManagedObjectContext
return try await managedObjectContext.perform {
let subscriptionRequest = NotificationSubscription.sortedFetchRequest
subscriptionRequest.predicate = NotificationSubscription.predicate(userToken: pushNotification.accessToken)