Pippo
Pippo

Reputation: 1473

unexpected non void return value in void function

I've been pouring over stack overflow for ages trying to find a way out of this error:

unexpected non void return value in void function

that I am getting with returning a Bool within my function.

i just can't seem to dig my way out of this one. I'm sure its something to do with async but I'm not very familiar with these types of functions.

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
            }

}

calling this from viewdidload on another vc doesn't allow enough time to get a true result

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

Upvotes: 0

Views: 1575

Answers (2)

Duncan C
Duncan C

Reputation: 131461

Your question is confusing because the code you posted does not have the error you describe. However, you're trying to create a function that returns a result from an async function. That is not how async works.

Async functions start to do a task in the background, where that task won't be finished before it's time to return.

You need to adjust your thinking. Instead of trying to return a result from your function, you need to write your function to take a completion handler. You then call the completion handler once the long-running task has finished (which is after your function has returned.)

@bubuxu provided you with code showing how to modify your function as I described.

Upvotes: 2

bubuxu
bubuxu

Reputation: 2197

If you want to write a checking class to listen to the reachability, define it as a singleton and pass the completeBlock to it like this:

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?
    }

} 

Upvotes: 1

Related Questions