NsoperationQueue Annuler toutes les opérations n'est pas annulée jusqu'à ce qu'il termine l'opération
De mon point de vue, j'ai d'affichage de l'image, les données d'affichage de l'image vient de l'Url, les images sont environ 1-3 MO .
Si l'utilisateur effectue alors je veux charger l'image suivante, Chaque chose fonctionne bien si les glisser lentement, Mais quand je l'ai lue Rapidement je veux Annuler l'opération précédente et de commencer avec la nouvelle url.
Pour Ex. si l'utilisateur effectue 4 fois si les opérations pour les 2ème et 3ème des images est dans le milieu, je veux annuler celles et démarrer le téléchargement 4 ème image
Mais maintenant, À la place de 4ème image, je suis la première de la 2e image suit 3ème et 4 ème image apparaît.
Voici mon exemple de code
- (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
}];
}];
}
Merci.
Êtes-vous recréer
BackgroundOperation
chaque fois qu'une image doit être chargée (avec BackgroundOperation=[[NSOperationQueue alloc]init];
)?OriginalL'auteur siva krishna | 2015-08-29
Vous devez vous connecter pour publier un commentaire.
Annulation d'une opération de pose seulement son
isCancelled
Drapeau de vrai.Vous êtes responsable de la vérification pour voir si votre opération a été annulée, avant qu'il ne commence à courir (ou alors qu'il est en cours d'exécution, si elle est une opération de longue durée).
Vous pouvez vérifiez si votre opération est annulée dans une opération de bloc mais je recommande de sous-classement, au lieu d'utiliser un bloc.
Je ne suis pas à l'aide de Nsoperation, Il semble isCancelled existent pour nsoperation
NSBlockOperation
est une sous-classe deNSOperation
. Il peut être annulée. Vérifier de nouveau le lien et de voir comment il saisit le (faible) blockOperation, donc isCancelled peut être vérifié à l'intérieur du bloc. Si vous n'êtes toujours pas sûr de savoir comment le faire, cochez cette article détaillé qui annule également bloquer les opérations.K je vais essayer avec ce lien, Mais je ne suis pas à l'aide de l'ARC, de Sorte whts l'alternative pour l' __faibles NSBlockOperation *weakOperation = loadImageOperation;
vous devriez être en utilisant l'ARC. pourquoi ne pas vous?
OriginalL'auteur
Appel
cancelAllOperations
sur unNSOperationQueue
appellerons tout simplementcancel
sur chacune de ses opérations. Si leNSOperation
ne remplace pascancel
puis il n'est jamais annulée.Il n'y a pas de concept de l'annulation d'une
NSBlockOperation
une fois qu'il a commencé. Le bloc exécute simplement et c'est qui.Si vous souhaitez spécifier spécial annuler le comportement (comme l'annulation de votre téléchargement d'image) vous avez besoin à la sous-classe
NSOperation
et remplacercancel
.Il existe de nombreux exemples de cela dans
AFNetworking
ouSDWebImage
Pour annuler un téléchargement d'image vous avez besoin pour conclure une
NSURLSesionDownloadTask
dans unNSOperation
puis remplacercancel
appelercancel
sur leNSURLSesionDownloadTask
Qui va annuler le bloc oui mais une fois le téléchargement de l'image a commencé il n'y a pas d'arrêt en utilisant simplement dataWithContentsOfURL
cancel
n'est pas réellement appelé sur toutes les opérations, elle ne fait qu'isCancelled
OUIOriginalL'auteur DBoyer
L'annulation de l'opération n'mise à jour de son
isCancelled
propriétéYES
.Pour être en mesure d'annuler l'opération, vous devez effectuer les opérations suivantes:
OriginalL'auteur Yariv