7

Sono di fronte a un problema relativo a NSoperationQueue. Nel mio codice in:La chiamata - (void) cancelAllOperations su NSoperationQueue non sta impostando la proprietà isCancelled di NSOperation che è presente all'interno della coda

-(void) viewDidLoad 
{ 
    //Initialisation of queue and operation. 
    //adding operation to queue 
    [self.operationQueue addOperation:op]; 

} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self.operationQueue cancelAllOperations]; 
} 

Così durante l'esecuzione della mia funzione principale NSOperation quando sto controllando per la proprietà isCancelled restituisce sempre NO. Infatti dopo aver chiamato cancellAllOperation su NSOperationQueue. es.

-(void)main 
{ 
    if(self.isCancelled) 
    { 
    // Never executing this block :-(
    } 

} 

Per maggiori dettagli sto facendo alcune chiamate di rete nel mio NSOperation.And quando sono passato a altra vista da allora cancelAllOperation viene richiamato. E quando la risposta di rete è tornata a nel mio NSOperation sto controllando se (Self.isCancelled) e ora sono in un'altra vista (significa isCancelled dovrebbe impostare SÌ). ma questo controllo fallisce sempre.

+0

Sei sicuro che l'operazione non sia già iniziata quando si chiama cancelAllOperations? Dovrai controllare che la proprietà isCancelled sia impostata durante l'esecuzione della tua operazione. –

+0

Sto verificando costantemente la proprietà isCancelled nel mio metodo main di funzionamento. Effettuo il debug attraverso i punti di interruzione e ho scoperto che dopo aver chiamato il metodo cancelAllOperation quando la chiamata ritorna a questo checkpoint se (self.isCancelled) ha sempre restituito NO. – kidsid49

+0

Stai sovrascrivendo il metodo 'cancel' su NSOperation? Se è così, puoi pubblicarlo? In caso contrario, puoi ignorare, (chiama super) e inserire un log o un breakpoint per vedere se è chiamato? –

risposta

1

L'operazione viene aggiunta alla coda subito dopo il caricamento della vista in viewDidLoad e la coda si assumerà la responsabilità di avviare l'operazione.

Poiché si annulla l'operazione o le operazioni quando la vista scompare (viewWillDisappear), è probabile che l'operazione venga completata in questo momento. In altre parole, l'operazione viene annullata dopo essere stata interrotta. È possibile controllare la proprietà isExecuting per sapere se l'operazione sta funzionando attivamente.

+0

Sto verificando costantemente la proprietà isCancelled nel mio metodo main di funzionamento. Effettuo il debug attraverso i punti di interruzione e ho scoperto che dopo aver chiamato il metodo cancelAllOperation quando la chiamata ritorna a questo checkpoint se (self.isCancelled) ha sempre restituito NO. La chiamata arriverà a questo checkpoint solo quando la mia operazione è in esecuzione. – kidsid49

1

Probabilmente l'operazione non è più in esecuzione e pertanto non verrà annullata. (Una volta terminata l'operazione, la coda di operazioni non ne terrà più traccia, quindi chiamare cancelAllOperations non farà nulla.)

Se la risposta di rete che stai aspettando chiama una richiamata piuttosto che bloccare la chiamata a main, l'operazione sarà già terminata (quando i ritorni principali). È possibile risolvere questo problema utilizzando un'operazione "simultanea" (consultare i documenti NSOperation, è possibile indicare quando si è terminato, piuttosto che eseguire automaticamente i ritorni principali) o utilizzando le chiamate di rete sincrone (quindi il comando principale non viene restituito fino a hai davvero finito).

+0

Ho capito il tuo punto. Quando arriva la mia risposta sto controllando la proprietà isCancelled se è SÌ sto restituendo altrimenti sto ricaricando il mio tabelView con contenuti freschi con è dalla risposta.Ora quello che voglio fare è se non sono in quella vista, quindi quando la risposta è tornata dovrebbe controllare isCancelled property e non dovrebbe ricaricare il mio tabelView se non sono attualmente in quella vista. Quindi puoi darmi un piccolo suggerimento su come gestire questa situazione? – kidsid49

+0

Bene, è possibile utilizzare un metodo di rete sincrono, come suggerito, e controllare isCancelled dopo che (poiché l'operazione sarà ancora in esecuzione). In alternativa, è possibile utilizzare una libreria parzialmente in parte come AFNetworking che ha NSOperations cancellabili per l'attività di rete già creata. –

Problemi correlati