Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BFTask cancellation #86

Closed
pronebird opened this issue Mar 21, 2015 · 5 comments
Closed

BFTask cancellation #86

pronebird opened this issue Mar 21, 2015 · 5 comments

Comments

@pronebird
Copy link

I looked through issues and documentation and I have no idea how to cancel network task that I do not need anymore.

@ryanmasondavies
Copy link

You need to set up a token of some kind, as described in the README:

Task Cancellation

It's generally bad design to keep track of the BFTaskCompletionSource for cancellation. 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]. For example:

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

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

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

Note: The cancellation token implementation should be thread-safe.
We are likely to add some concept like this to Bolts at some point in the future.

This just means writing a separate class with an interface like:

@interface MYCancellationToken: NSObject
@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled;
- (void)cancel;
@end

You can create this and make sure your task callbacks keep a hold of it during the network process. You should check for the token's cancellation as appropriate and halt the task (by returning [BFTask cancelledTask]) when that happens. Further callbacks can check for prior cancellation of a task using -[BFTask isCancelled].

@pronebird
Copy link
Author

Thanks. I get BFTasks from Parse, and such ops as save cannot be cancelled apparently as Parse does not expose a method for that, and BFTask cannot be marked as cancelled either which is ... bummer. Even NSProgress supports cancellation and allows developers to provide cancellation handler.

@pronebird
Copy link
Author

Closing as it's not going anywhere this way. #dealingwithit

@ryanmasondavies
Copy link

Just want to point out that with Parse the 'long' tasks that might need
cancelling are often file uploads and downloads, and they do support
cancellation in an instance method on PFFile. The sadness comes from
having to upload/download separately to saving objects in order to cancel.
Queries, saving, deleting, fetching, etc don't support cancellation AFAIK.

On 27 March 2015 at 15:21, Andrej Mihajlov [email protected] wrote:

Closing as it's not going anywhere this way. #dealingwithit


Reply to this email directly or view it on GitHub
#86 (comment)
.

@pronebird
Copy link
Author

@iotize thanks, I use combination of file uploads and save, but also another use case is if I attach PFFiles to model and call save on model, then it will automatically upload files first and then save the record on Parse. I wish they had cancellation for models too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants