gpt4 book ai didi

Swift取消DispatchQueue进程

转载 作者:搜寻专家 更新时间:2023-10-31 22:04:08 24 4
gpt4 key购买 nike

我有一个 UDP 方法,它使用 DispatchQueue 使用以下代码等待回复:

DispatchQueue.global(qos: .userInitiated).async {
let server:UDPServer=UDPServer(address:"0.0.0.0", port:5005)
let (data,_,_) = server.recv(1024)
DispatchQueue.main.async {
...
}
}

这完美地工作并启动了一个等待我的数据进入的过程。让我夜不能寐的是如果我们没有得到回复会发生什么? server.recv 永远不会返回,所以我看不到这个过程将如何结束?有没有办法给它预定的运行时间?

最佳答案

无法从外部停止或“杀死”DispatchWorkItemNSOperation。有一个 cancel() 方法,但它只是将项目或操作的 isCancelled 属性设置为 true。这不会停止项目本身的执行。 Ans 因为 recv 是阻塞的,所以在执行期间无法检查 isCancelled 标志。这意味着 Vadian 发布的答案很遗憾不会做任何事情。

根据Apple docsNSOperation.cancel 上:

This method does not force your operation code to stop.

The sameNSOperationQueue.cancelAllOperations:

Canceling the operations does not automatically remove them from the queue or stop those that are currently executing.

您可能认为可以使用原始 NSThread。然而,同样的原则适用于他。您无法从外部确定性地终止线程。

可能的解决方案:超时

我能想到的最好的解决方案是使用套接字的超时功能。我不知道 UDPServer 来自哪里,但也许它有一个内置超时。

可能的解决方案:穷人的超时(发送数据包到本地主机)

您可以尝试的另一种选择是在经过一定时间后向您自己发送一些 UDP 数据包。这样,recv 将接收到一些数据,然后继续执行。这可能被用作“穷人的暂停”。

关于Swift取消DispatchQueue进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com