GCD cancel async block?

cocoa, ios, iphone, macos, objective-c

Solution

To archieve it using GCD you have to use your own atomic flag.

But there is a better solution where you have cancellation of tasks out of the box. It is a NSOperationQueue.

You can read everything you need under this link: http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

Problem

I have regular code for loading images in table view cells ``` dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSImage *image = file.image; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = image; }); }); ``` The problem is when I scroll too fast I can see that last block fires several times on same `imageView`. And that looks really weird. Is there any way to cancel all previously scheduled operations for one `imageView` (lets say they all will have unique id) before scheduling new one? I mean, I want to be sure that only last scheduled operation should be executed and all all previously scheduled should be dropped. Is that possible by means of `Grand Central Dispatch`? Or I have to add my own atomic flags to imageView objects and check whether flags are set before calling `imageView.image = image;`

Original source