TRG
TRG

Reputation: 865

PromiseKit firstlyOn style method

PromiseKit provides a convenience method thenOn for running parts of your chain on non-main threads. However there doesn't appear to be any convenient way of setting the first promise execution thread.

This means that I end up either placing a DispatchQueue.global(x).async inside my first promise, or I use a dummy first promise.

Placing the DispatchQueue bit in my first promise feels broken, I'm moving the threading decision from the main execution chain to the individual promise, but just for that one promise. If I later prepend a promise to my chain, I have to move all that threading logic around... not good.

What i've been doing lately is this:

    let queue = DispatchQueue.global(qos: .userInitiated)

    Promise(value: ()).then(on: queue) {

        // Now run first promise function

    }

This is definitely a cleaner solution, but I was wondering if anyone knew of an even better solution... I'm sure this isn't a rare scenario after all?

Upvotes: 1

Views: 1426

Answers (2)

mxcl
mxcl

Reputation: 26893

We provide:

DispatchQueue.global().promise {
    //…
}

firstly does not take a queue because it executes its contents immediately for the default case and thus allowing it to have a configured queue would make its behavior confusingly variable.

UPDATE: At the latest version it looks like

DispatchQueue.global().async(.promise) {  
    //...          
}

Upvotes: 2

Ihar Katkavets
Ihar Katkavets

Reputation: 1570

You can perform your operation on any queue, just call fulfill or reject from it

Look at example:

override func viewDidLoad() {
    super.viewDidLoad()

    firstly {
        doFirstly()
        }
        .then {
            self.doMain()
        }
        .then {
            self.doLastest()
        }
        .catch { error in
            // handle error
        }
        .always {
            // finish
    }
}

func doFirstly() -> Promise<Void> {
    return Promise { fulfill, reject in
        let queue = DispatchQueue.global(qos: .userInitiated)
        queue.async {
            // do your operation here
            fulfill()
        }
    }
}

func doMain() -> Promise<Void> {
    return Promise { fulfill, reject in
        let queue = DispatchQueue.main
        queue.async {
            // do your operation here
            fulfill()
        }
    }
}

func doLastest() -> Promise<Void> {
    return Promise { fulfill, reject in
        let queue = DispatchQueue.global(qos: .userInitiated)
        queue.async {
            // do your operation here
            fulfill()
        }
    }
}

Upvotes: 0

Related Questions