在我看来我有图像视图,图像视图的数据来自Url,图像大约1-3 MB。 如果用户Swipes然后我想加载下一个图像,如果慢速刷卡,每件事情都可以正常工作,但是当我快速滑动时,我想取消之前的操作并以新网址开始。
对于Ex。如果第二和第三张图像的操作位于中间,如果用户滑动4次,我想取消它们并开始下载第4张图像
但是现在在第4张图像的位置我第一张第2张图像跟随第3张然后第4张图像出现。
这是我的示例代码
- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)aSwipeGestureRecognizer {
[BackgroundOperation cancelAllOperations]; // To cancel previous one
[self performSelector:@selector(LoadImage) withObject:nil afterDelay:0.1];
}
-(void)LoadImage
{
BackgroundOperation=[[NSOperationQueue alloc]init];
imgvww.image=[UIImage imageNamed:@"loader.png"]; // Place holder till download finishes
[BackgroundOperation addOperationWithBlock:^
{
UIImage *img=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.ItemDetails objectAtIndex:0] objectForKey:@"ImageUrl"]]]]; // Getting data from URL
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
imgvww.image=img; //Adding to image view after completion
}];
}];
}
谢谢。
答案 0 :(得分:5)
在cancelAllOperations
上拨打NSOperationQueue
只会在其每个操作上调用cancel
。如果NSOperation
没有覆盖cancel
,那么它永远不会被取消。
一旦启动,就没有取消NSBlockOperation
的概念。该块只是执行,就是那个。
如果要指定特殊取消行为(例如取消图像下载),则需要继承NSOperation
并覆盖cancel
。
AFNetworking
或SDWebImage
要取消图片下载,您需要在NSURLSesionDownloadTask
中结束NSOperation
,然后覆盖cancel
以致电cancel
上的NSURLSesionDownloadTask
答案 1 :(得分:5)
取消操作只是将其isCancelled
标志设置为true。
您有责任在开始运行之前检查您的操作是否已被取消(或者在运行期间,如果它是长时间运行的操作)。
您可以check if your operation is cancelled within an operation block但我建议使用子类,而不是使用块。
答案 2 :(得分:3)
取消操作只会将其isCancelled
属性更新为YES
要取消操作,您应该执行以下操作:
NSBlockOperation * op = [NSBlockOperation new];
__weak NSBlockOperation * weakOp = op; // Use a weak reference to avoid a retain cycle
[op addExecutionBlock:^{
// Put this code between whenever you want to allow an operation to cancel
// For example: Inside a loop, before a large calculation, before saving/updating data or UI, etc.
if (weakOp.isCancelled) return;
// Do something..
];