una suscripcion pantalla hbo eliminar compras compra como cancelar apple app iphone ios nsoperation nsoperationqueue

iphone - suscripcion - ¿Cómo cancelar fuera de servicio creado con addOperationWithBlock?



como eliminar una compra de itunes (2)

Realmente no puede verificar si necesita cancelar la operación si está en un bloque. Si está en un bloque y se supone que debe cancelarse, entonces se cancela. No es posible acceder a las propiedades de NSOperation porque el bloque no es una instancia de NSOperation per se.

Código de ejemplo:

#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSOperationQueue *q = [[NSOperationQueue alloc] init]; [q addOperationWithBlock:^{ [NSThread sleepForTimeInterval:10]; NSLog(@"Block 1"); }]; [q addOperationWithBlock:^{ [NSThread sleepForTimeInterval:3]; NSLog(@"Block 2"); }]; [q cancelAllOperations]; [NSThread sleepForTimeInterval:15]; [pool drain]; return 0; }

Si elimina la llamada cancelAllOperations, los bloques se activarán como se espera.

Le sugeriría que si necesita tener un control más preciso sobre el estado de cancelación de la operación y la interacción con la NSOperationQueue, sería mejor utilizar una NSOperation en lugar de un NSBlockOperation. Puede subclasificar NSOperation para lograr esto.

Estoy usando addOperationWithBlock de NSOperationQueue. Desde dentro del bloque, ¿cómo verifico si debo cancelar la operación? ¿O acceder a cualquier propiedad / método NSOperation?

[myOperationQueue addOperationWithBlock: ^{ while ( /* long running loop */ ) { // how to determine here if I need to cancel? // for that matter, access any NSOperation properties/methods? } }];

¿Es la mejor manera de hacer esto para usar un NSBlockOperation?


Una solución mejor podría ser usar NSBlockOperation y agregarlo a la cola en lugar de un bloque en bruto. Podrías hacer algo como:

__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ while(![operation isCancelled]){ //Some long operation } }]; [[self queue] addOperation:operation];

Esto le permite usar bloques mientras le da un poco más de control sobre la operación ... y también algunas NSOperation (como la capacidad de agregar bloques de terminación, por ejemplo).