CoreDataInitializationCoordinator.swift 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. /// This actor provides us with logic to handle cases when a caller
  2. /// tries to initialize a coreDataStack that is already initialized.
  3. actor CoreDataInitializationCoordinator {
  4. private var isInitialized = false
  5. private var initializationTask: Task<Void, Error>?
  6. func ensureInitialized(perform initialization: @escaping () async throws -> Void) async throws {
  7. // If already initialized, return immediately
  8. if isInitialized {
  9. return
  10. }
  11. // If initialization is in progress, await the existing task
  12. if let existingTask = initializationTask {
  13. try await existingTask.value
  14. return
  15. }
  16. // Start a new initialization task
  17. let newTask = Task {
  18. do {
  19. try await initialization()
  20. isInitialized = true
  21. } catch {
  22. // Clear task reference on failure
  23. initializationTask = nil
  24. throw error
  25. }
  26. // Clear task reference on success
  27. initializationTask = nil
  28. }
  29. initializationTask = newTask
  30. try await newTask.value
  31. }
  32. }