Skip to content

Commit cf3f13d

Browse files
committed
refactor: replace main-queue callbacks with structured concurrency
1 parent 85b09db commit cf3f13d

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

app/dauphin/View/LibSSoLoginView.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,19 @@ struct LibSSOLoginView: UIViewRepresentable {
1010
class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
1111
var parent: LibSSOLoginView
1212
private let allowedHosts: Set<String> = ["sso.tku.edu.tw"]
13+
private var evaluateTokenTask: Task<Void, Never>?
1314

1415
init(parent: LibSSOLoginView) { self.parent = parent }
1516

17+
deinit { evaluateTokenTask?.cancel() }
18+
1619
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
1720
// Web page loaded
18-
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
21+
evaluateTokenTask?.cancel()
22+
evaluateTokenTask = Task { @MainActor in
23+
try? await Task.sleep(nanoseconds: 500_000_000)
24+
guard !Task.isCancelled else { return }
25+
1926
let javascript = """
2027
try {
2128
var token = getSsoLoginToken();
@@ -26,11 +33,9 @@ struct LibSSOLoginView: UIViewRepresentable {
2633
}
2734
"""
2835

29-
webView.evaluateJavaScript(javascript) { (result, error) in
30-
if let error = error {
31-
LibSSOLoginView.logger.error(
32-
"JavaScript execution error: \(error.localizedDescription)")
33-
}
36+
do { _ = try await webView.evaluateJavaScript(javascript) } catch {
37+
LibSSOLoginView.logger.error(
38+
"JavaScript execution error: \(error.localizedDescription)")
3439
}
3540
}
3641
}

app/dauphin/View/Setting/ClearCacheView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ struct ClearCacheView: View {
4141

4242
withAnimation(.spring()) { cacheCleared = true }
4343

44-
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
44+
Task {
45+
try? await Task.sleep(nanoseconds: 3_000_000_000)
4546
withAnimation { cacheCleared = false }
4647
}
4748
}

app/dauphin/ViewModels/CourseViewModel.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ import SwiftUI
6666

6767
private func startNetworkMonitor() {
6868
monitor.pathUpdateHandler = { [weak self] path in
69-
guard let self = self else { return }
70-
DispatchQueue.main.async {
69+
Task { @MainActor [weak self] in
70+
guard let self = self else { return }
7171
self.isNetworkAvailable = (path.status == .satisfied)
7272
if self.isNetworkAvailable {
7373
Self.logger.debug("Network is available")
@@ -147,7 +147,8 @@ import SwiftUI
147147
self.cacheUpdateMessage =
148148
forceRefresh ? "Refreshed successfully" : "Course data updated"
149149

150-
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
150+
Task { @MainActor [weak self] in
151+
try? await Task.sleep(nanoseconds: 2_000_000_000)
151152
self?.cacheUpdateMessage = nil
152153
}
153154
} catch {
@@ -158,7 +159,8 @@ import SwiftUI
158159
self.errorMessage = "Failed to fetch courses."
159160
} else if forceRefresh {
160161
self.cacheUpdateMessage = "Refresh failed"
161-
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
162+
Task { @MainActor [weak self] in
163+
try? await Task.sleep(nanoseconds: 2_000_000_000)
162164
self?.cacheUpdateMessage = nil
163165
}
164166
}

0 commit comments

Comments
 (0)