首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SimplePing清理RunLoop.current.run代码

用SimplePing清理RunLoop.current.run代码
EN

Stack Overflow用户
提问于 2020-04-04 20:00:09
回答 1查看 245关注 0票数 0

我从苹果公司找到了SimplePing库,并希望在SwiftUI项目中使用它。

要使用这个库,我可以在线编写代码,它可以正常工作。start函数如下:

代码语言:javascript
复制
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的委托就不会被调用。

如何在不阻塞主线程的情况下简化这段代码并使用它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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项目中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61034038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档