Ho creato una sottoclasse NSOperation per gestire alcune operazioni di archivio zip. Non importa cosa, se sovrascrivo -start
o -main
questo blocco di codice avviene sempre:NSOperation non sta accadendo nella thread in background
if ([NSThread isMainThread]) {
NSLog(@"I am in the main thread");
return;
}
Qualsiasi idea di cosa sta succedendo?
Ho provato ad aggiungere questo blocco:
- (void) start { //also tried overriding main
if ([NSThread isMainThread]) {
NSLog(@"In main thread, trying again");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self start];
});
return;
//hard working code etc...
//cpu intensive zip operations...
}
Ma questo provoca un incidente, un EXC_BAD_ACCESS
violazione indicando la linea di dispatch_async
.
Forse sto semplicemente fraintendendo questo, ma sembra che avrai un ciclo infinito nel tuo blocco, perché stai chiamando start from inside itself. Stai aggiungendo l'nsoperation a una coda, o stai chiamando start te stesso? –
@BenPious non è un ciclo infinito, perché quando viene chiamato dall'interno di 'dispatch_async', la condizione (' [NSThread isMainThread] ') sarà falsa. –
Puoi mostrare (a) la creazione del tuo 'NSOperationQueue'; e (b) l'aggiunta di queste operazioni al tuo 'NSOperationQueue'? Se li "avviano manualmente", saranno sul thread principale, ma se li aggiungi a "NSOperationQueue" che crei, non dovrebbero. Secondo [documenti] (http://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591-RH2-SW15) " quando chiamate il metodo 'start' di un'operazione non simultanea direttamente dal vostro codice, l'operazione viene eseguita immediatamente nel thread corrente." – Rob