2015-08-29 5 views
7

In meiner Sicht habe ich Bildansicht, die Daten für die Bildansicht kommt Form Url, die Bilder sind um 1-3 MB. Wenn der Benutzer Swipes, dann möchte ich das nächste Bild laden, funktioniert alles gut, wenn swiped langsam, aber wenn ich schnell geklaut habe möchte ich die vorherige Operation abbrechen und mit neuen URL beginnen.NsoperationQueue Abbrechen alle Operationen wird nicht abgebrochen, bis es den Vorgang beendet

Für Ex. Wenn der Benutzer 4 Mal wischt, wenn die Operationen für das 2. und 3. Bild in der Mitte sind, möchte ich diese abbrechen und das 4. Bild starten.

Jetzt aber an die Stelle des 4. Bildes bekomme ich zuerst 2. Bild folgt 3. und dann erscheint das 4. Bild.

Hier ist mein Beispielcode

- (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 


     }]; 

    }]; 
} 

Danke.

+0

Bitte bemühen Sie den Code so zu formatieren, dass andere Leute es lesen kann. – jtbandes

+1

Erinnern Sie 'BackgroundOperation' jedes Mal, wenn ein Bild geladen werden muss (mit' BackgroundOperation = [[NSOperationQueue alloc] init]; ')? –

Antwort

5

rufen einen Vorgang abbrechen setzt nur seinen isCancelled Flag auf wahr.

Sie sind dafür verantwortlich, zu überprüfen, ob Ihr Vorgang abgebrochen wurde, bevor er gestartet wird (oder während der Ausführung, wenn es sich um einen lang andauernden Vorgang handelt).

Sie können check if your operation is cancelled within an operation block, aber ich würde subclassing empfehlen, anstatt einen Block zu verwenden.

+0

Ich habe nicht klar verstanden, Es scheint v muss isCancelled überprüft werden.Aber ich bin verwirrt, wo ich es in meinem Code überprüfen kann –

+0

Im nicht mit Nsoperation, Es scheint isCancelled existieren für nsoperation –

+0

'NSBlockOperation' ist eine Unterklasse von' NSOperation'. Es kann storniert werden. Überprüfen Sie den Link erneut und sehen Sie, wie er die (schwache) blockOperation erfasst, sodass isCancelled innerhalb des Blocks überprüft werden kann. Wenn Sie immer noch nicht sicher sind, wie Sie das tun, [überprüfen Sie diesen ausführlichen Artikel] (http://nghiatran.me/advanced-issues-the-right-way-to-load-content-in-backgrounds-thread-with tableview /), wodurch auch Blockoperationen abgebrochen werden. –

4

Rufen Sie cancelAllOperations auf einem NSOperationQueue wird einfach cancel auf jedem seiner Operationen aufrufen. Wenn die NSOperationcancel nicht überschreibt, wird sie nie abgebrochen.

Es gibt kein Konzept zum Abbrechen einer NSBlockOperation, sobald es gestartet wurde. Der Block wird einfach ausgeführt und das ist der Fall.

Wenn Sie ein spezielles Abbruchverhalten angeben möchten (z. B. Abbrechen des Bilddownloads), müssen Sie NSOperation ableiten und cancel überschreiben.

Es gibt viele Beispiele in AFNetworking oder SDWebImage

ein Bild herunterladen Sie ein NSURLSesionDownloadTask in einem NSOperation einpacken müssen, um abzubrechen und cancel außer Kraft setzen cancel auf dem NSURLSesionDownloadTask

+0

keine Notwendigkeit, eine NSOperation abzubrechen, um abbrechen zu können, ist es möglich, dies innerhalb des ausgeführten Blocks zu tun – Yariv

+1

Das wird den Block ja abbrechen, aber sobald der Bilddownload gestartet wurde, kann er nicht mehr gestoppt werden, indem einfach dataWithContentsOfURL – DBoyer

+0

'cancel' ist nicht wirklich alle Operationen aufgerufen, es setzt nur "isCancelled" zu JA – trapper

3

Durch Abbrechen des Vorgangs wird nur die isCancelled-Eigenschaft auf YES aktualisiert.
Um in der Lage sein, den Vorgang abzubrechen, sollten Sie Folgendes tun:

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.. 
];