2017-03-29 6 views
0

J'utilise PageViewController où je peux avoir plus d'une image comme contenu. Je reçois l'image comme suit du service. Cependant, lorsque l'utilisateur clique pour fermer le viewcontroller alors que l'opération réseau continue, l'application se bloque.NSOperationQueue n'est pas annulé

queue = [[NSOperationQueue alloc] init]; 
operation = [NSBlockOperation blockOperationWithBlock:^{ 
      [self addAllImages]; 
       dispatch_sync(dispatch_get_main_queue(), ^(void) { 
        [self pageViewcontrollerSetup]; 
      }); 
     }]; 
    [queue addOperation:operation]; 
} 

- (void) addAllImages 
{ 
    self.pageImages =[[NSMutableArray alloc] initWithCapacity:self.pageControl.numberOfPages]; 

    for(id key in [[[pElements objectAtIndex:self.selectedIndexPath.row]objectForKey:@"pdetail"] objectForKey:@"images"]) { 
     NSString *productURL = [NSString stringWithFormat:@"%@%@", PRODUCT_URL, [[[[pElements objectAtIndex:self.selectedIndexPath.row]objectForKey:@"pdetail"] objectForKey:@"images"] objectForKey:key]]; 
     NSData* productData = [NSData dataWithContentsOfURL:[NSURL URLWithString:productURL]]; 

     if ([UIImage imageWithData:productData]) { 
       [self.pageImages addObject:[UIImage imageWithData:productData]]; 
     } 
    } 
} 

- (void)closeBtnClicked { 

    [queue cancelAllOperations]; 
} 

REMARQUE: j'utilisais GCD (Grand Central Dispatch) pour le multi-threading, mais je suis venu pour savoir que vous ne pouvez pas l'annuler, donc je swicthed à NSOperationQueue

Répondre

0

Annulation d'une opération ne arrête magiquement votre code mort dans ses voies. Il est à votre code dans l'opération de vérifier périodiquement pour voir si l'opération a été annulée, et de s'incliner si oui.

+0

pourriez-vous s'il vous plaît me donner un petit exemple? Je pensais 'cancelAllOperations' annuler immédiatement le fil correspondant. si non, alors quel est le but de l'utilisation de [queue cancelAllOperations]; – hotspring

+0

Avez-vous regardé le lien que j'ai posté? Il vous montre comment vérifier l'annulation dans votre bloc d'opération. – matt