commit 654a15a99d4602aef462ab106b5cb7c6d8c01216
parent 077f2402a3d9bb233a854eb19e33704653de5334
Author: Michael Camilleri <[email protected]>
Date: Wed, 23 Sep 2026 23:21:27 +0900
Clear Release build warnings from actor access and scheme setup
Release builds emitted actor-isolation and capture warnings in the
diagnostics share sheet, Chronicle reconciliation, and Core Data logging.
This commit keeps UIKit setup and event logging on the main actor and
captures the logger directly in background context callbacks.
The scheme also removes Xcode's Swift debug environment variables before
running Git to calculate the build number, avoiding Git's warnings about
those variables.
Co-Authored-By: Codex GPT 6 Sol <[email protected]>
Diffstat:
6 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/Crossmate.xcodeproj/xcshareddata/xcschemes/Crossmate.xcscheme b/Crossmate.xcodeproj/xcshareddata/xcschemes/Crossmate.xcscheme
@@ -11,7 +11,7 @@
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
- scriptText = "cd "${SRCROOT}" mkdir -p Generated buildYear=`git log -1 --format=%cd --date=format:%Y` buildVersion=`git rev-list HEAD | wc -l | tr -d ' '` { echo '#include? "Local.xcconfig"' echo "CURRENT_PROJECT_VERSION = $buildYear.$buildVersion" } > Generated/Config.xcconfig ">
+ scriptText = "cd "${SRCROOT}" mkdir -p Generated unset SWIFT_DEBUG_INFORMATION_FORMAT SWIFT_DEBUG_INFORMATION_VERSION buildYear=`git log -1 --format=%cd --date=format:%Y` buildVersion=`git rev-list HEAD | wc -l | tr -d ' '` { echo '#include? "Local.xcconfig"' echo "CURRENT_PROJECT_VERSION = $buildYear.$buildVersion" } > Generated/Config.xcconfig ">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
diff --git a/Crossmate/Persistence/GameStore.swift b/Crossmate/Persistence/GameStore.swift
@@ -1798,6 +1798,7 @@ final class GameStore {
/// the game. Rows carry a source key so the local-log readers skip them.
func cacheRemoteJournals(_ journals: [DeviceJournal], forGameID gameID: UUID) async {
let ctx = persistence.container.newBackgroundContext()
+ let eventLog = eventLog
ctx.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
await ctx.perform {
let gameReq = NSFetchRequest<GameEntity>(entityName: "GameEntity")
@@ -1835,8 +1836,8 @@ final class GameStore {
if skippedOutOfGrid > 0 {
let message = "GameStore: replay cache skipped \(skippedOutOfGrid) "
+ "out-of-grid remote journal entr(ies)"
- Task { @MainActor [weak self] in
- self?.eventLog?.note(message, level: "error")
+ Task { @MainActor in
+ eventLog?.note(message, level: "error")
}
}
game.replayCacheComplete = true
@@ -1844,8 +1845,8 @@ final class GameStore {
try ctx.save()
} catch {
let message = "GameStore: replay cache save failed — \(error)"
- Task { @MainActor [weak self] in
- self?.eventLog?.note(message, level: "error")
+ Task { @MainActor in
+ eventLog?.note(message, level: "error")
}
}
}
diff --git a/Crossmate/Persistence/PersistenceController.swift b/Crossmate/Persistence/PersistenceController.swift
@@ -305,6 +305,7 @@ final class PersistenceController {
/// of rows that could be in that state.
private func backfillCachedSummaryFields() {
let bg = container.newBackgroundContext()
+ let eventLog = eventLog
bg.perform {
let req = NSFetchRequest<GameEntity>(entityName: "GameEntity")
req.predicate = NSPredicate(
@@ -321,8 +322,8 @@ final class PersistenceController {
do {
try bg.save()
} catch {
- Task { @MainActor [weak self] in
- self?.eventLog?.note(
+ Task { @MainActor in
+ eventLog?.note(
"PersistenceController: backfillCachedSummaryFields save failed — \(error)",
level: "error"
)
@@ -344,6 +345,7 @@ final class PersistenceController {
/// No-ops on every subsequent launch.
private func backfillZoneIdentityFields() {
let bg = container.newBackgroundContext()
+ let eventLog = eventLog
bg.perform {
let req = NSFetchRequest<GameEntity>(entityName: "GameEntity")
req.predicate = NSPredicate(
@@ -363,8 +365,8 @@ final class PersistenceController {
do {
try bg.save()
} catch {
- Task { @MainActor [weak self] in
- self?.eventLog?.note(
+ Task { @MainActor in
+ eventLog?.note(
"PersistenceController: backfillZoneIdentityFields save failed — \(error)",
level: "error"
)
diff --git a/Crossmate/Sync/GameArchiver.swift b/Crossmate/Sync/GameArchiver.swift
@@ -806,16 +806,16 @@ final class GameArchiver {
let present = Set(identified.map(\.originalGameID))
let ctx = persistence.container.newBackgroundContext()
- let known: Set<UUID> = await ctx.perform {
+ let (known, removed): (Set<UUID>, Int) = await ctx.perform {
let removed = ChronicleLedgerEntity.retainOnly(present, in: ctx)
if ctx.hasChanges { try? ctx.save() }
- if removed > 0 {
- self.eventLog?.note(
- "GameArchiver: chronicle ledger dropped \(removed) stale entr" +
- (removed == 1 ? "y" : "ies")
- )
- }
- return ChronicleLedgerEntity.knownOriginalGameIDs(in: ctx)
+ return (ChronicleLedgerEntity.knownOriginalGameIDs(in: ctx), removed)
+ }
+ if removed > 0 {
+ eventLog?.note(
+ "GameArchiver: chronicle ledger dropped \(removed) stale entr" +
+ (removed == 1 ? "y" : "ies")
+ )
}
let outstanding = identified.filter { !known.contains($0.originalGameID) }
diff --git a/Crossmate/Views/Settings/DiagnosticsView.swift b/Crossmate/Views/Settings/DiagnosticsView.swift
@@ -332,6 +332,7 @@ private struct DiagnosticsShareButton: UIViewRepresentable {
private enum DiagnosticsShareItem {
private static let fileName = "crossmate-diagnostics.txt"
+ @MainActor
static func configuration(for dump: DiagnosticsDump) -> UIActivityItemsConfiguration {
let provider = NSItemProvider()
provider.suggestedName = fileName
diff --git a/project.yml b/project.yml
@@ -175,6 +175,7 @@ schemes:
- script: |
cd "${SRCROOT}"
mkdir -p Generated
+ unset SWIFT_DEBUG_INFORMATION_FORMAT SWIFT_DEBUG_INFORMATION_VERSION
buildYear=`git log -1 --format=%cd --date=format:%Y`
buildVersion=`git rev-list HEAD | wc -l | tr -d ' '`
{