繁体   English   中英

void函数中意外的non void返回值

[英]unexpected non void return value in void function

我一直在寻找堆栈溢出的问题,试图找出解决此错误的方法:

void函数中意外的non void返回值

我在函数中返回一个Bool值。

我似乎无法从这条路中摸索出来。 我确定它与异步有关,但是我对这些类型的函数不是很熟悉。

class CheckReachability {


    class func setupReachability (hostName:String?, useClosures: Bool) -> Bool{

        var reachability : Reachability!
        var connected = false

                let reachability2 = hostName == nil ? Reachability() : Reachability(hostname: hostName!)
                reachability = reachability2
                try! reachability?.startNotifier()

                if useClosures {
                    reachability2?.whenReachable = { reachability in
                        DispatchQueue.main.async {
                            connected = true
                            print("Reachable....")
                        }
                    }
                    reachability2?.whenUnreachable = { reachability in
                        DispatchQueue.main.async {
                            connected = false
                            print("Not Connected....")
                        }
                    }

                } else {
                    NotificationCenter.default.addObserver(self, selector: Selector(("reachabilityChanged:")), name: ReachabilityChangedNotification, object: reachability2)
                }
            return connected
            }

}

从另一台vc上的viewdidload调用此命令没有足够的时间来获得真实的结果

        let connected = CheckReachability.setupReachability(hostName: nil, useClosures: true)
if connected {

您的问题令人困惑,因为您发布的代码没有您描述的错误。 但是,您试图创建一个从异步函数返回结果的函数。 异步不是这样工作的。

异步函数开始在后台执行任务,该任务在返回之前就不会完成。

您需要调整自己的想法。 无需尝试从函数中返回结果,而是需要编写函数以采用完成处理程序。 然后,您可以在长时间运行的任务完成后(即在函数返回之后)调用完成处理程序。

@bubuxu为您提供了代码,显示了如我所述如何修改功能。

如果要编写一个检查类来侦听可到达性,请将其定义为单例,然后将completeBlock传递给它,如下所示:

class CheckReachability {

    static let shared = CheckReachability()

    var reachability: Reachability?

    func setupReachability(hostName:String?, completeBlock: ((Bool) -> Void)? = nil) {

        reachability = hostName == nil ? Reachability() : Reachability(hostname: hostName!)

        try? reachability?.startNotifier()

        if let block = completeBlock {
            reachability?.whenReachable = { reachability in
                DispatchQueue.main.async {
                    print("Reachable....")
                    block(true)
                }
            }
            reachability?.whenUnreachable = { reachability in
                DispatchQueue.main.async {
                    print("Not Connected....")
                    block(false)
                }
            }
        } else {
            // If we don't use block, there is no point to observe it.
            NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged(_:)), name: .ReachabilityChangedNotification, object: nil)
        }

    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func reachabilityChanged(_ notification: Notification) {
        // ?? what should we do here?
    }

} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM