Domanda

C'è qualche modo per l'invio di questo messaggio per specificare che io invece ho il mio selettore eseguito dopo tutti gli eventi dell'interfaccia utente in sospeso, se del caso? Vale a dire. dare il mio aterDelay timer una priorità più bassa nella coda degli eventi.

È stato utile?

Soluzione

Non direttamente. Se si utilizza performSelector:withObject:afterDelay: il selettore viene eseguita sul thread principale , quindi, per definizione, si verificherà dopo tutti gli attuali eventi dell'interfaccia utente "in sospeso" sono stati effettuati, ma questo potrebbe essere nel bel mezzo di un rotolo o di animazione, che si sarebbe probabilmente prendere in considerazione per essere un evento continuo, ma è in realtà centinaia di quelli separati.

Tuttavia, è possibile ottenere qualcosa di simile utilizzando performSelectorInBackground:withObject:, e quindi chiamando [NSThread setThreadPriority:0.01] nel metodo di essere chiamato. Essere l'apertura di un thread in background attenzione: sei, quindi non è possibile fare tutte le chiamate di interfaccia utente. Tuttavia, questo vi permetterà di fare il lavoro su un thread in background con priorità inferiore rispetto thread dell'interfaccia utente principale. (Ricordate di istituire una piscina autorelease dal momento che è nel proprio thread!)

Altri suggerimenti

In realtà, performSelector:withObject:afterDelay: non devono necessariamente verificarsi sul filo principale; è per questo che c'è un metodo separato performSelectorOnMainThread:withObject:waitUntilDone:. La documentazione per +[NSThread detachNewThreadSelector:toTarget:withObject:] dice

  

richiama un metodo del ricevitore sul corrente filo utilizzando la modalità predefinita dopo un ritardo.

Se si desidera eseguire un task in background, si potrebbe guardare in <=>, che lancerà un nuovo thread per eseguire il vostro compito, e lasciare l'interfaccia utente sensibile. Utilizzando un thread separato per eseguire un compito di lunga durata che potrebbero altrimenti lock-up l'interfaccia utente è generalmente una buona idea, ma lo fa aggiungere complessità. Se non hai familiarità con filettatura, si può finire con gli insetti che non hanno alcun senso.

In un commento di cui sopra, lei ha detto che si pensa l'animazione può essere in colpa per rendere l'interfaccia utente non risponde. In caso si sta utilizzando il supporto integrato per l'animazione (Core Animation o uno degli involucri di cacao), animazione non dovrebbe rendere l'interfaccia utente non risponde. Un risponde UI generalmente significa che il programma sta facendo un sacco di lavoro sul thread principale prima di lasciare il circuito corsa tornare a eventi dell'interfaccia utente di servizi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top