我从Kotlin / Native框架在本机iOS端调用方法。该方法异步完成其工作,并在与调用该线程不同的线程中以一些数据进行响应。
我想要一种在同一线程中也调用响应函数的方法。下面是代码:
func makePostRestRequest(url: String, body: String) {
let thread1 = Thread.current
let request = NetworkServiceRequest(url: url,
httpMethod: "POST",
bodyJSON: body)
NetworkService.processRequest(requestModel: request) { [weak self] (response: Any?, requestStatus: RequestStatus) in
// This is different thread than "thread1". Need the below code to execute on "thread1"
if requestStatus.result == .fail {
knResponseCallback.onError(errorResponse: requestStatus.error)
} else {
knResponseCallback.onSuccess(response: response)
}
}
}
我试图用两种方法解决这个问题。
一个是使用“信号量”。我只是在网络调用之后阻止了代码执行,当我将结果返回到网络请求的回调中时,我将其保存在变量中并发出信号量。之后,我只需调用knResponseCallback并使用响应变量返回响应即可。
我使用的另一种方法是使用RunLoops。我得到了RunLoop.current的句柄,以一种方式启动runLoop并在网络请求的回调中,我只调用了NSObject的perform selector on thread with object
方法,该方法将工作分派给该线程本身。
他们两个的问题是他们阻止了呼叫。 RunLoop.run和semaphore.wait都阻止了它们被调用的线程。
是否有一种方法可以在不阻塞特定线程的情况下将工作从另一个线程分派到特定线程上?
您需要创建一个队列来发送请求,并使用相同的队列来处理响应。这样的事情应该为您工作:
let queue = DispatchQueue(label: "my-thread")
queue.async {
let request = NetworkServiceRequest(url: url,
httpMethod: "POST",
bodyJSON: body)
NetworkService.processRequest(requestModel: request) { [weak self] (response: Any?, requestStatus: RequestStatus) in
queue.async {
if requestStatus.result == .fail {
knResponseCallback.onError(errorResponse: requestStatus.error)
} else {
knResponseCallback.onSuccess(response: response)
}
}
}
}