Fix CoreData concurrency things

This commit is contained in:
Shadowfacts 2022-01-09 18:46:42 -05:00
parent dd71c06257
commit 61f073109c
2 changed files with 114 additions and 3 deletions

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1320"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D6C687E7272CD27600874C10"
BuildableName = "Reader.app"
BlueprintName = "Reader"
ReferencedContainer = "container:Reader.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D6C68800272CD27700874C10"
BuildableName = "ReaderTests.xctest"
BlueprintName = "ReaderTests"
ReferencedContainer = "container:Reader.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D6C6880A272CD27700874C10"
BuildableName = "ReaderUITests.xctest"
BlueprintName = "ReaderUITests"
ReferencedContainer = "container:Reader.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D6C687E7272CD27600874C10"
BuildableName = "Reader.app"
BlueprintName = "Reader"
ReferencedContainer = "container:Reader.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
<CommandLineArgument
argument = "-com.apple.CoreData.ConcurrencyDebug 1"
isEnabled = "YES">
</CommandLineArgument>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "D6C687E7272CD27600874C10"
BuildableName = "Reader.app"
BlueprintName = "Reader"
ReferencedContainer = "container:Reader.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -39,6 +39,13 @@ class PersistentContainer: NSPersistentContainer {
}
}
@MainActor
private func saveViewContext() async throws {
if viewContext.hasChanges {
try viewContext.save()
}
}
func lastSyncDate() async throws -> Date? {
return try await backgroundContext.perform {
let state = try self.backgroundContext.fetch(SyncState.fetchRequest()).first
@ -56,8 +63,8 @@ class PersistentContainer: NSPersistentContainer {
}
try self.backgroundContext.save()
try self.viewContext.save()
}
try await self.saveViewContext()
}
func sync(serverGroups: [Fervor.Group], serverFeeds: [Fervor.Feed]) async throws {
@ -87,9 +94,9 @@ class PersistentContainer: NSPersistentContainer {
if self.backgroundContext.hasChanges {
try self.backgroundContext.save()
try self.viewContext.save()
}
}
try await self.saveViewContext()
}
func syncItems(_ syncUpdate: ItemsSyncUpdate) async throws {
@ -123,9 +130,9 @@ class PersistentContainer: NSPersistentContainer {
if self.backgroundContext.hasChanges {
try self.backgroundContext.save()
try self.viewContext.save()
}
}
try await self.saveViewContext()
}
}