我从苹果公司找到了SimplePing库,并希望在SwiftUI项目中使用它。
要使用这个库,我可以在线编写代码,它可以正常工作。start函数如下:
public func start(hostName: String) {
let pinger = SimplePing(hostName: "192.168.178.20")
pinger.delegate = self
pinger.start()
var count = 5
repeat {
if (self.canStartPinging) {
pinger.send(with: nil)
count-=1
if count == 0{
self.canStartPinging = false
break
}
}
RunLoop.current.run(mode: RunLoop.Mode.default, before: NSDate.distantFuture)
} while(true)我真的不明白为什么我需要RunLoop.current.run(mode: RunLoop.Mode.default, before: NSDate.distantFuture)线。当我删除它时,SimplePing的委托就不会被调用。
如何在不阻塞主线程的情况下简化这段代码并使用它?
发布于 2020-04-04 22:02:07
run(mode:before:)允许运行循环在repeat-while循环旋转时处理事件。这是一种使阻塞循环允许在run循环上发生事情的方法。
您还没有共享设置canStartPinging的代码,但我猜想,至少SimplePingDelegate方法didStartWithAddress会设置它。因此,如果您在不调用run(mode:before:)的情况下在主线程上旋转,那么SimplePing委托方法可能永远没有被调用的机会。通过添加该run调用,至少可以运行委托方法。
你对此的怀疑--这种旋转和调用run(mode:before:)的模式--是有道理的。这是非常低效的模式。它应该被消除。
如果这是一个标准的Swift项目,我建议您只使用委托-协议模式,您就可以完成了。由于这是SwiftUI,我建议将其重构为一个组合Publisher,然后可以将其集成到您的SwiftUI项目中。
https://stackoverflow.com/questions/61034038
复制相似问题