diff --git a/packages/frontend/apps/ios/App/App/AffineHttpHandler.swift b/packages/frontend/apps/ios/App/App/AffineHttpHandler.swift index 4a0267de40..1a25b3d6d1 100644 --- a/packages/frontend/apps/ios/App/App/AffineHttpHandler.swift +++ b/packages/frontend/apps/ios/App/App/AffineHttpHandler.swift @@ -13,7 +13,7 @@ enum AffineHttpError: Error { class AffineHttpHandler: NSObject, WKURLSchemeHandler { func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) { - urlSchemeTask.stopped = Mutex.init(false) + urlSchemeTask.stopped = false guard let rawUrl = urlSchemeTask.request.url else { urlSchemeTask.didFailWithError(AffineHttpError.invalidOperation(reason: "bad request")) return @@ -55,8 +55,8 @@ class AffineHttpHandler: NSObject, WKURLSchemeHandler { let task = URLSession.shared.dataTask(with: request) { (rawData, rawResponse, error) in - urlSchemeTask.stopped?.withLock({ - if $0 { + DispatchQueue.main.async { + if urlSchemeTask.stopped { return } @@ -89,7 +89,7 @@ class AffineHttpHandler: NSObject, WKURLSchemeHandler { } urlSchemeTask.didFinish() } - }) + } } task.resume() @@ -97,20 +97,18 @@ class AffineHttpHandler: NSObject, WKURLSchemeHandler { } func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) { - urlSchemeTask.stopped?.withLock({ - $0 = true - }) + urlSchemeTask.stopped = true urlSchemeTask.dataTask?.cancel() } } private extension WKURLSchemeTask { - var stopped: Mutex? { + var stopped: Bool { get { - return objc_getAssociatedObject(self, &stoppedKey) as? Mutex ?? nil + return objc_getAssociatedObject(self, &stoppedKey) as? Bool ?? false } set { - objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_RETAIN) + objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_ASSIGN) } } var dataTask: URLSessionDataTask? { diff --git a/packages/frontend/apps/ios/App/App/AffineWsHandler.swift b/packages/frontend/apps/ios/App/App/AffineWsHandler.swift index ae78327641..0dabbf0ba8 100644 --- a/packages/frontend/apps/ios/App/App/AffineWsHandler.swift +++ b/packages/frontend/apps/ios/App/App/AffineWsHandler.swift @@ -21,7 +21,7 @@ enum AffineWsError: Error { class AffineWsHandler: NSObject, WKURLSchemeHandler { var wsTasks: [UUID: URLSessionWebSocketTask] = [:] func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) { - urlSchemeTask.stopped = Mutex.init(false) + urlSchemeTask.stopped = false guard let rawUrl = urlSchemeTask.request.url else { urlSchemeTask.didFailWithError(AffineWsError.invalidOperation(reason: "bad request")) return @@ -79,9 +79,8 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler { var completionHandler: ((Result) -> Void)! completionHandler = { let result = $0 - urlSchemeTask.stopped?.withLock({ - let stopped = $0 - if stopped { + DispatchQueue.main.async { + if urlSchemeTask.stopped { return } let jsonEncoder = JSONEncoder() @@ -96,7 +95,7 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler { urlSchemeTask.didReceive("data: \(json)\n\n".data(using: .utf8)!) urlSchemeTask.didFinish() } - }) + } // recursive calls webSocketTask.receive(completionHandler: completionHandler) @@ -148,8 +147,8 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler { webSocketTask.send(.string(stringBody), completionHandler: { error in - urlSchemeTask.stopped?.withLock({ - if $0 { + DispatchQueue.main.async { + if urlSchemeTask.stopped { return } if error != nil { @@ -161,26 +160,24 @@ class AffineWsHandler: NSObject, WKURLSchemeHandler { urlSchemeTask.didReceive(try! jsonEncoder.encode(["uuid": uuid.uuidString.data(using: .utf8)!])) urlSchemeTask.didFinish() } - }) + } }) } } func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) { - urlSchemeTask.stopped?.withLock({ - $0 = true - }) + urlSchemeTask.stopped = true urlSchemeTask.wsTask?.cancel(with: .abnormalClosure, reason: "Closed".data(using: .utf8)) } } private extension WKURLSchemeTask { - var stopped: Mutex? { + var stopped: Bool { get { - return objc_getAssociatedObject(self, &stoppedKey) as? Mutex ?? nil + return objc_getAssociatedObject(self, &stoppedKey) as? Bool ?? false } set { - objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_RETAIN) + objc_setAssociatedObject(self, &stoppedKey, newValue, .OBJC_ASSOCIATION_ASSIGN) } } var wsTask: URLSessionWebSocketTask? {