Search code examples
swiftasynchronousparse-platformbackground-process

How to return a value to a function while in background process subfunction in swift


I first tried this solution to return a bool in the spot I want to return it. However, due to the parse.com function saveInBackgroundWithBlock() being a void return function, I got the error "Unexpected non-void return value in void function".

func saveObjectToParse(gameLocal: Game) -> Bool {
        let game = PFObject(className:"Game")
        game["sport"] = gameLocal.sport.rawValue
        var saved = false
        game.saveInBackgroundWithBlock {
            (success: Bool, error: NSError?) -> Void in
            if (success) {
                print("Object has been saved.")
                saved = true
                return saved
            } else {
                print("parse error")
                return saved
            }
        }
    }

So, I tried moving the return statements out of the subfunction like this:

func saveObjectToParse(gameLocal: Game) -> Bool {
        let game = PFObject(className:"Game")
        game["sport"] = gameLocal.sport.rawValue
        var saved = false
        game.saveInBackgroundWithBlock {
            (success: Bool, error: NSError?) -> Void in
            if (success) {
                print("Object has been saved.")
                saved = true
            } else {
                print("parse error")
            }
        }
        return saved
    }

However, this returns saved before the saveInBackgroundWithBlock() block executes because it is a background process. Therefore, saved will never be true, even when it is intended to be. I have tried adding a boolean flag called done and tried waiting with a while(!done) loop, but this freezes the program on the loop and the background process never executes. How can I fix these problems?


Solution

  • I agree with restructuring not needing a bool returned, but if you really, really need this set up, you could save your object synchronously (so your code will wait) like so,

    do {
            try game.save()
        } catch {
            print(error)
        }