x/mobile: 当从Swift调用Go代码并通过网络通信时,UI挂起;time.Sleep可以正常工作

bxgwgixi  于 10个月前  发布在  Go
关注(0)|答案(4)|浏览(100)

我使用quic-go实现了一个发送消息给服务器并接收数据的函数,然后通过gomobile的bind命令将其转换为iOS库。
这个函数在swift中如下调用。
我正在使用"Task.detached"进行异步调用,但是当QuicFetch函数开始处理时,UI停止了。
我尝试性地修改了golang的Fetch函数的代码,如下所示,并以相同的方式在swift中使用它。
这个函数在后台正确处理,UI没有停止。
我想了解为什么仅在与quic-go通信时尝试在后台处理时,UI会停止。

jaxagkaj

jaxagkaj1#

如果我猜的话,你在Fetch中发起的调用最终会在iOS上执行系统调用,而Go运行时需要阻塞线程。如果你最终在UI线程(通常是主线程,我想这可能是你从Swift调用Go的地方)上,那么你会看到UI停滞。然而,这并不能完全解释为什么time.Sleep能正常工作,因为一旦你调用Go,为调用Go的线程创建的goroutine就绑定到那个线程了。

话说回来,time.Sleep通常不会阻塞一个线程,goroutine只是最后进入一些定时器数据结构,稍后执行。

关于如何从Swift调用Go的更多细节,你能提供吗?我个人对x/mobile不太熟悉,所以我不知道中间代码到底在做什么。我猜调用是通过cgo进行的,但除此之外,如果有人熟悉这方面的话,提供更多的细节会更好。

8tntrjer

8tntrjer2#

CC @golang/runtime and maybe @hyangah for x/mobile knowledge?

zbq4xfa0

zbq4xfa03#

通过执行命令"gomobile bind -target ios",可以创建XCFramework。这可以在xcode中加载,以便从swift调用Go。

rkkpypqq

rkkpypqq4#

@hyangah , @crawshaw ,你们有什么解决方案吗?如果不介意的话,请帮我检查一下这个问题。

相关问题