|
|
@@ -72,7 +72,7 @@ public enum CallbackQueue: Sendable {
|
|
|
enum CallbackQueueMain {
|
|
|
static func currentOrAsync(_ block: @MainActor @Sendable @escaping () -> Void) {
|
|
|
if Thread.isMainThread {
|
|
|
- MainActor.assumeIsolated { block() }
|
|
|
+ MainActor.runUnsafely { block() }
|
|
|
} else {
|
|
|
DispatchQueue.main.async { block() }
|
|
|
}
|
|
|
@@ -82,3 +82,17 @@ enum CallbackQueueMain {
|
|
|
DispatchQueue.main.async { block() }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+extension MainActor {
|
|
|
+ @_unavailableFromAsync
|
|
|
+ static func runUnsafely<T>(_ body: @MainActor () throws -> T) rethrows -> T {
|
|
|
+#if swift(>=5.10)
|
|
|
+ return try MainActor.assumeIsolated(body)
|
|
|
+#else
|
|
|
+ dispatchPrecondition(condition: .onQueue(.main))
|
|
|
+ return try withoutActuallyEscaping(body) { fn in
|
|
|
+ try unsafeBitCast(fn, to: (() throws -> T).self)()
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ }
|
|
|
+}
|