iphone multithreading ios nsthread

iphone - ¿Ayuda con subprocesos múltiples en iOS?



multithreading nsthread (3)

Tengo una aplicación que utiliza OpenEars y la biblioteca de Flite. El problema es que la biblioteca de Flite requiere muchos recursos y está congelando mi aplicación. Sospecho que ejecutar Flite en un hilo de fondo arreglará las cosas, pero no tengo idea de cómo hacerlo.

Dicho esto, ¿cómo implemento un hilo de fondo en iOS ?

Apreciaría si alguien me puede indicar algunos tutoriales, compartir un código de muestra o algún consejo general que me ayude a resolver este problema.


Swift 3

DispatchQueue.global(qos: .userInteractive).async { // Code to run on background thread // Switch to the main UI thread to display any results needed DispatchQueue.main.async { // Run code on main UI thread here } }

El parámetro qos significa "Calidad de servicio". Piense en ello como una prioridad para dar su hilo de fondo:

  • .userInteractive (la prioridad más alta)
  • .userInitiated (cuando puedes ahorrar unos segundos)
  • .utility (cuando puedes ahorrar unos segundos a unos pocos minutos)
  • .background (prioridad más baja - minutos / horas de sobra)

La Guía de programación de concurrencia de Apple es una buena lectura. La programación concurrente no es algo que deba aprender copiando un código de muestra de la web y pirateando hasta que esté satisfecho. Es bueno conocer las opciones y los principios para evitar los problemas.

Revisando la respuesta después de un tiempo, hoy en día casi no puedes equivocarte con Grand Central Dispatch. Ejecutar una tarea en segundo plano se ve así:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self doSomeLongTask]; // 1 dispatch_async(dispatch_get_main_queue(), ^{ [self longTaskDidFinish]; // 2 }); });

La tarea larga (1) se ejecutará en algún subproceso en segundo plano y no hay ningún problema que yo sepa, es decir. ya hay un grupo de autorelease en ese hilo, no tiene que preocuparse por los bucles de ejecución, etc. Después de que la tarea finalice, el código llama a -longTaskDidFinish en el hilo principal (2), para que pueda actualizar la interfaz de usuario o cualquier otra cosa. Este es un lenguaje de uso frecuente.


Quizás lo mejor que puedes hacer es este tutorial de Apple . ¡Lo leí cuidadosamente (10-20 minutos) y "enhebre" toda mi aplicación! ¡Excelente!