NsoperationQueue取消所有操作在完成操作之前不会被取消

时间:2015-08-29 05:14:15

标签: ios nsoperationqueue cancellation

在我看来我有图像视图,图像视图的数据来自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 


         }];

     }];
 }

谢谢。

3 个答案:

答案 0 :(得分:5)

cancelAllOperations上拨打NSOperationQueue只会在其每个操作上调用cancel。如果NSOperation没有覆盖cancel,那么它永远不会被取消。

一旦启动,就没有取消NSBlockOperation的概念。该块只是执行,就是那个。

如果要指定特殊取消行为(例如取消图像下载),则需要继承NSOperation并覆盖cancel

AFNetworkingSDWebImage

中有很多例子

要取消图片下载,您需要在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..
];