Skip to content

Commit eb66254

Browse files
committed
Avoid synchronous installed Xcode discovery during launch
1 parent e07f2f7 commit eb66254

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

Xcodes/Backend/AppState+Install.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,15 @@ extension AppState {
7777
}
7878

7979
private func getXcodeArchiveAsync(_ installationType: InstallationType, downloader: Downloader) async throws -> (AvailableXcode, URL) {
80+
let installedXcodes = await updateInstalledXcodesAsync(recomposeAllXcodes: false)
81+
8082
switch installationType {
8183
case .version(let availableXcode):
8284
let resolution = try mapInstallResolutionError {
8385
try XcodeInstallResolutionService().resolve(
8486
.availableXcode(availableXcode),
8587
availableXcodes: [],
86-
installedXcodes: Current.files.installedXcodes(Path.installDirectory),
88+
installedXcodes: installedXcodes,
8789
willInstall: true
8890
)
8991
}

Xcodes/Backend/AppState+Update.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ extension AppState {
2626
updateTaskID = nil
2727
}
2828
}
29+
await self.updateInstalledXcodesAsync()
2930
await self.updateSelectedXcodePathAsync()
3031
}
3132
updateTask = task
@@ -49,6 +50,7 @@ extension AppState {
4950
}
5051
}
5152
do {
53+
await self.updateInstalledXcodesAsync()
5254
await self.updateSelectedXcodePathAsync()
5355
let xcodes = try await self.updateAvailableXcodes(from: self.dataSource)
5456
try Task.checkCancellation()

Xcodes/Backend/AppState.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class AppState: ObservableObject {
4848
}
4949
updateAllXcodes(
5050
availableXcodes: newValue,
51-
installedXcodes: Current.files.installedXcodes(Path.installDirectory),
51+
installedXcodes: installedXcodes,
5252
selectedXcodePath: selectedXcodePath
5353
)
5454
}
@@ -61,11 +61,12 @@ class AppState: ObservableObject {
6161
willSet {
6262
updateAllXcodes(
6363
availableXcodes: availableXcodes,
64-
installedXcodes: Current.files.installedXcodes(Path.installDirectory),
64+
installedXcodes: installedXcodes,
6565
selectedXcodePath: newValue
6666
)
6767
}
6868
}
69+
private var installedXcodes: [InstalledXcode] = []
6970
@Published var updateTask: Task<Void, Never>?
7071
var updateTaskID: UUID?
7172
var isUpdating: Bool { updateTask != nil }
@@ -228,6 +229,9 @@ class AppState: ObservableObject {
228229
guard !isTesting else { return }
229230
try? loadCachedAvailableXcodes()
230231
try? loadCacheDownloadableRuntimes()
232+
Task { @MainActor in
233+
await updateInstalledXcodesAsync()
234+
}
231235
helperStatusTask = Task { @MainActor in
232236
await checkIfHelperIsInstalled()
233237
helperStatusTask = nil
@@ -855,6 +859,24 @@ class AppState: ObservableObject {
855859
}
856860
}
857861

862+
@discardableResult
863+
func updateInstalledXcodesAsync(recomposeAllXcodes: Bool = true) async -> [InstalledXcode] {
864+
let installDirectory = Path.installDirectory
865+
let files = Current.files
866+
let installedXcodes = await Task.detached(priority: .userInitiated) {
867+
files.installedXcodes(installDirectory)
868+
}.value
869+
870+
self.installedXcodes = installedXcodes
871+
if recomposeAllXcodes {
872+
updateAllXcodes(
873+
availableXcodes: availableXcodes,
874+
installedXcodes: installedXcodes,
875+
selectedXcodePath: selectedXcodePath
876+
)
877+
}
878+
return installedXcodes
879+
}
858880

859881
// MARK: - Private
860882

0 commit comments

Comments
 (0)