ios - GCD vs performSelectorInBackground/performSelectorOnMainThread
objective-c nsthread (2)
Cuándo usar performSelectorInBackground:
Nunca. No utilice este método. Se genera un número ilimitado de hilos. Incluso antes de que GCD estuviera disponible, este era un método horrible.
Cuándo usar performSelectorOnMainThread:
Meh ... Nunca, pero solo porque es un inconveniente. No hay nada profundamente equivocado con este método. Simplemente no es tan útil como dispatch_async()
.
La diferencia entre GCD y los métodos anteriores de performSelector…
(y NSThread
en general) es que GCD administra un grupo de subprocesos por usted. En general, debes evitar el enhebrado manual en cacao. En su lugar, utilice NSOperationQueue
o GCD (métodos de dispatch
). Proporcionan una abstracción de cola más útil en lugar de obligarle a administrar manualmente los subprocesos.
Asegúrate de leer la sección Migración lejos de hilos de Apple para obtener más información.
Soy nuevo en el desarrollo de ios. Tengo las siguientes preguntas:
- Cuando usamos GCD (dispatch_group_async, dispatch_async (dispatch_get_main_queue () ...) y cuando usamos performSelectorInBackground / performSelectorOnMainThread?
¿Cuál es la diferencia entre esos dos?
Sé que cuando usamos performSelectorInBackground, creamos un nuevo NSThread. ¿Pero no es lo mismo cuando usamos dispatch_group_async? Porque si creamos más de un dispatch_group_async, significa que debemos enviar más de un bloque en la cola. Y esos bloques pueden correr en diferentes colas. Por lo tanto, cuando creamos más de un dispatch_group_async, ¿significa que creamos un nuevo hilo? (porque los bloques pueden ejecutarse en colas diferentes) (Estoy un poco confundido acerca de NSThread y la cola de bloques .....)
¡¡Gracias!!
En realidad, después de iOS 4.0 no puedo encontrar una sola razón para usar performSelectorInBackground / onMainThread. Si necesita hacer algo en segundo plano, use GCD (o, mejor, NSOperationQueue
que se construye sobre GCD desde 4.0 y ofrece mayor flexibilidad con poca sobrecarga), pero asegúrese de no crear ciclos de retención cuando use bloques.