Skip to content

Commit 6ff78f7

Browse files
Issue #116 : Dispatch network calls to io dispatcher.
1 parent df8b21e commit 6ff78f7

File tree

1 file changed

+20
-5
lines changed
  • engine-webview/src/iosMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/ios

1 file changed

+20
-5
lines changed

engine-webview/src/iosMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/ios/ResourceHandler.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package com.pega.constellation.sdk.kmp.engine.webview.ios
33
import com.pega.constellation.sdk.kmp.core.Log
44
import kotlinx.cinterop.ObjCSignatureOverride
55
import kotlinx.coroutines.CoroutineScope
6+
import kotlinx.coroutines.Dispatchers
7+
import kotlinx.coroutines.IO
68
import kotlinx.coroutines.Job
79
import kotlinx.coroutines.isActive
810
import kotlinx.coroutines.launch
911
import platform.Foundation.NSData
1012
import platform.Foundation.NSError
13+
import platform.Foundation.NSLock
1114
import platform.Foundation.NSLocalizedDescriptionKey
1215
import platform.Foundation.NSURLRequest
1316
import platform.Foundation.NSURLResponse
@@ -26,6 +29,7 @@ class ResourceHandler(
2629
val mainScope: () -> CoroutineScope
2730
) : NSObject(), WKURLSchemeHandlerProtocol {
2831
lateinit var delegate: ResourceHandlerDelegate
32+
private val tasksLock = NSLock()
2933
private val tasks = mutableMapOf<NSURLRequest, Job>()
3034

3135
private suspend fun send(request: NSURLRequest): Pair<NSData, NSURLResponse> {
@@ -37,7 +41,7 @@ class ResourceHandler(
3741
webView: WKWebView,
3842
startURLSchemeTask: WKURLSchemeTaskProtocol
3943
) {
40-
mainScope().launch {
44+
mainScope().launch(Dispatchers.IO) {
4145
try {
4246
Log.i(TAG, "Starting WKURLScheme task. <${startURLSchemeTask.request.URL}>")
4347
val (data, response) = send(startURLSchemeTask.request)
@@ -46,7 +50,7 @@ class ResourceHandler(
4650
return@launch
4751
}
4852
Log.i(TAG, "WKURLScheme task is finished. <${startURLSchemeTask.request.URL}>")
49-
tasks.remove(startURLSchemeTask.request)
53+
tasksLock.withLock { tasks.remove(startURLSchemeTask.request) }
5054
startURLSchemeTask.didReceiveResponse(response)
5155
startURLSchemeTask.didReceiveData(data)
5256
startURLSchemeTask.didFinish()
@@ -59,7 +63,7 @@ class ResourceHandler(
5963
startURLSchemeTask.didFailWithError(e.toNSError())
6064
}
6165
}.let { job ->
62-
tasks[startURLSchemeTask.request] = job
66+
tasksLock.withLock { tasks[startURLSchemeTask.request] = job }
6367
}
6468
}
6569

@@ -69,8 +73,19 @@ class ResourceHandler(
6973
stopURLSchemeTask: WKURLSchemeTaskProtocol
7074
) {
7175
Log.i(TAG, "Stopping WKURLScheme task. <${stopURLSchemeTask.request.URL}>")
72-
tasks[stopURLSchemeTask.request]?.cancel()
73-
tasks.remove(stopURLSchemeTask.request)
76+
tasksLock.withLock {
77+
tasks[stopURLSchemeTask.request]?.cancel()
78+
tasks.remove(stopURLSchemeTask.request)
79+
}
80+
}
81+
}
82+
83+
private inline fun <T> NSLock.withLock(block: () -> T): T {
84+
lock()
85+
try {
86+
return block()
87+
} finally {
88+
unlock()
7489
}
7590
}
7691
private fun Throwable.toNSError(): NSError {

0 commit comments

Comments
 (0)