Giter VIP home page Giter VIP logo

Comments (5)

darrinm avatar darrinm commented on July 23, 2024

I've been wondering the same thing. Thanks for asking.

from bolts-objc.

bklimt avatar bklimt commented on July 23, 2024

It's generally bad design to keep track of the BFTaskCompletionSource for cancellation. For one, that introduces too many opportunities for the source to have its result or error set when you didn't want them to. But a bigger concern is that as you compose tasks together, you will often have one concept of a "cancelable operation" that's composed of several tasks chained together. For example, querying for a new object online might have multiple async subtasks for retrying or writing the results to a local file or database. And some high-level tasks may even share subtasks. You don't want cancellation one of the high-level tasks to cancel all of them.

So a better model is to create a "cancellation token" at the top level, and pass that to each async function that you want to be part of the same "cancelable operation". Then, in your continuation blocks, you can check whether the cancellation token has been cancelled and bail out early by returning a [BFTask cancelledTask].

We are likely to add some concept like this to Bolts at some point in the future. In the meantime, you can use an NSOperation simply as an implementation of an object that is thread-safe and has cancel and isCancelled method. :-) For example:

- (void)doSomethingComplicatedAsync:(NSOperation *)cancellationToken {
    [[self doSomethingAsync:cancellationToken] continueWithBlock:^{
        if (cancellationToken.isCancelled) {
            return [BFTask cancelledTask];
        }
        // Do something that takes a while.
        return result;
    }];
}

// Somewhere else.
NSOperation *cancellationToken = [[NSOperation alloc] init];
[obj doSomethingComplicatedAsync:cancellationToken];

// When you get bored...
[cancellationToken cancel];

from bolts-objc.

saniul avatar saniul commented on July 23, 2024

Cool, thanks for advice!

I guess It might be a good idea to propose the cancellation token approach in the README?

from bolts-objc.

bklimt avatar bklimt commented on July 23, 2024

Yeah, I think so. Feel free to open a pull request. ;-)

Or we will add it later.

from bolts-objc.

saniul avatar saniul commented on July 23, 2024

Already on it.

from bolts-objc.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.