2011-10-27 30 views
5

Strappandomi i capelli, qualsiasi pensiero o suggerimento sarebbe molto apprezzato.performSelectorOnMainThread non viene eseguito

Ho un oggetto che chiama performSelectorOnMainThread:withObject:waitUntilDone: su se stesso da un thread figlio. Questo funziona bene il 95% del tempo. Ogni tanto dalle versioni beta di iOS e ora in uscita, un dispositivo rifiuterà di eseguire le chiamate performSelectorOnMainThread:withObject:waitUntilDone: ... Nessun messaggio di errore, non si blocca, non riesco a far entrare un dispositivo in uno stato in cui "non riesce" "ma una volta lì, continua a fallire fino a quando non elimini e reinstallo l'app, o lo forza per uscire, quindi aggiusto la sua tolleranza sui servizi di localizzazione, quindi lo lancio di nuovo, quindi aggiusto nuovamente i suoi servizi di localizzazione alla normalità. .. il riavvio del dispositivo non lo risolve. Reinstallare senza eliminare prima non lo aggiusta. È molto strano ... So che funziona la maggior parte del tempo perché la maggior parte dei dispositivi non ha problemi, tuttavia alcuni dispositivi falliscono un po 'regolarmente (ogni 3 o 4 giorni forse). So che è specificamente che performSelectorOnMainThread:withObject:waitUntilDone: non sta chiamando ciò che dovrebbe perché ho un dispositivo guasto ora e ho inserito un NSLog nel metodo che dovrebbe essere chiamato. Esso funziona bene, ma sul dispositivo guasto, quando performSelectorOnMainThread:withObject:waitUntilDone: viene utilizzato per chiamare tale metodo NSLog mostra non è in esecuzione ...

Questo avvenimento iniziato con IOS 5 beta e ancora, accade sul rilascio. Succede più spesso su 2 dei miei dispositivi, ma su nessuno degli altri 10 dispositivi su cui ho provato personalmente. Ho pensato che fosse solo il mio dispositivo da qualche inconveniente nella beta, ma succede sul mio nuovissimo 4S che non ha mai toccato la beta, così come sull'iPad 2 di un utente (non sul mio iPad 2).

Non so davvero dove guardare. Lo dico per eseguire e di solito lo fa su quasi tutti i dispositivi, ma la stessa linea non riceve risposta e nessun errore ecc. Su alcuni ...

+0

Are stai usando CoreData per caso? Ho avuto un problema simile. Quello che stava realmente accadendo era un deadlock del thread in attesa di eseguire un'operazione di lettura usando CoreData mentre l'altro thread stava cercando di scrivere. – picciano

+0

@picciano come hai fatto ad aggirare questo? Sto riscontrando lo stesso problema e non riesco a capire cosa devo fare per risolvere il deadlock. –

risposta

3

performSelectorOnMainThread: withObject: waitUntilDone può essere a volte insopportabile. Hai pensato di provare a usare lib dispatch?

È possibile creare un blocco e post-it sul thread principale in questo modo:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

Ciò avrebbe lo stesso salvataggio effetto come l'utilizzo performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

RunLoop ha diverse modalità diverse di un thread. E 'possibile che durante la volta che si effettua la chiamata il thread principale è in esecuzione in una modalità diversa da quella di default (che è quella di mira da performSelectorOnMainThread:withObject:WaitUntilDone:.

considerare l'utilizzo di performSelectorOnMainThread:withObject:waitUntilDone:modes:
Vedi Apple's documentation.

inoltre - GCD (libdispatch) è impressionante, ma non vi proteggerà da cucinare da soli una situazione di stallo: si consideri il caso in cui il metodo è in esecuzione sul thread principale e si sta chiamando:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 
Problemi correlati