我使用quic-go实现了一个发送消息给服务器并接收数据的函数,然后通过gomobile的bind命令将其转换为iOS库。这个函数在swift中如下调用。我正在使用"Task.detached"进行异步调用,但是当QuicFetch函数开始处理时,UI停止了。我尝试性地修改了golang的Fetch函数的代码,如下所示,并以相同的方式在swift中使用它。这个函数在后台正确处理,UI没有停止。我想了解为什么仅在与quic-go通信时尝试在后台处理时,UI会停止。
jaxagkaj1#
如果我猜的话,你在Fetch中发起的调用最终会在iOS上执行系统调用,而Go运行时需要阻塞线程。如果你最终在UI线程(通常是主线程,我想这可能是你从Swift调用Go的地方)上,那么你会看到UI停滞。然而,这并不能完全解释为什么time.Sleep能正常工作,因为一旦你调用Go,为调用Go的线程创建的goroutine就绑定到那个线程了。
Fetch
time.Sleep
话说回来,time.Sleep通常不会阻塞一个线程,goroutine只是最后进入一些定时器数据结构,稍后执行。
关于如何从Swift调用Go的更多细节,你能提供吗?我个人对x/mobile不太熟悉,所以我不知道中间代码到底在做什么。我猜调用是通过cgo进行的,但除此之外,如果有人熟悉这方面的话,提供更多的细节会更好。
8tntrjer2#
CC @golang/runtime and maybe @hyangah for x/mobile knowledge?
zbq4xfa03#
通过执行命令"gomobile bind -target ios",可以创建XCFramework。这可以在xcode中加载,以便从swift调用Go。
rkkpypqq4#
@hyangah , @crawshaw ,你们有什么解决方案吗?如果不介意的话,请帮我检查一下这个问题。
4条答案
按热度按时间jaxagkaj1#
如果我猜的话,你在
Fetch
中发起的调用最终会在iOS上执行系统调用,而Go运行时需要阻塞线程。如果你最终在UI线程(通常是主线程,我想这可能是你从Swift调用Go的地方)上,那么你会看到UI停滞。然而,这并不能完全解释为什么time.Sleep
能正常工作,因为一旦你调用Go,为调用Go的线程创建的goroutine就绑定到那个线程了。话说回来,
time.Sleep
通常不会阻塞一个线程,goroutine只是最后进入一些定时器数据结构,稍后执行。关于如何从Swift调用Go的更多细节,你能提供吗?我个人对x/mobile不太熟悉,所以我不知道中间代码到底在做什么。我猜调用是通过cgo进行的,但除此之外,如果有人熟悉这方面的话,提供更多的细节会更好。
8tntrjer2#
CC @golang/runtime and maybe @hyangah for x/mobile knowledge?
zbq4xfa03#
通过执行命令"gomobile bind -target ios",可以创建XCFramework。这可以在xcode中加载,以便从swift调用Go。
rkkpypqq4#
@hyangah , @crawshaw ,你们有什么解决方案吗?如果不介意的话,请帮我检查一下这个问题。