Reputation: 9472
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;
Upvotes: 2
Views: 5127
Reputation: 2842
Someone already said it, but using [[NSOperationQueue mainQueue] cancelAllOperations];
to cancel operations has worked like a charm for me in when managing intense networking calls.
Upvotes: 2
Reputation: 960
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
Upvotes: 8