2010-12-05 5 views
24

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

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

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

+0

que han sido capaces de racionalizar la biblioteca Flite OpenEars' a través de colas o hilos? – Rasman

+0

@Rasman - No lo he intentado, honestamente, he estado muy ocupado. Estoy trabajando en subprocesamiento múltiple en otro proyecto, así que puedo volver a visitarlo pronto. – Moshe

+0

ok, como seguimiento, acabo de construir mi aplicación con cola de envío y parece funcionar bien por ahora. En realidad, todo fue más fácil de lo que esperaba ... – Rasman

Respuesta

45

El Concurrency Programming Guide de Apple es una buena lectura. La programación concurrente no es algo que desee recoger copiando un código de muestra de la web y pirateando hasta que esté satisfecho. Es bueno conocer las opciones y los principios para salvarse de los problemas.


Revisando la respuesta después de un tiempo, hoy en día casi no puedes equivocarte al utilizar Grand Central Dispatch. Ejecución de 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 un poco de hilo de fondo y no hay capturas que yo sepa, es decir. ya hay un grupo de autorrelease en ese hilo, no tiene que preocuparse por ejecutar loops, etc. Una vez que la tarea finaliza, el código llama al -longTaskDidFinish en el hilo principal (2), para que pueda actualizar UI o lo que sea. Este es un modismo de uso frecuente.

+0

Lo que dijo Zoul; enhebrar es difícil. Incluso si su código parece estar funcionando cuando se ejecuta, aún puede estar muy muy mal. – bbum

+0

Dime cómo puedo obtener este hilo de mi método doSOmeLongTask? Por ejemplo, me gusta que hayas publicado. y dentro de mi método "doSomeLongTask" necesito hacer algunas cosas al final de este hilo – Shial

+0

Lo que entraría en '[self.longTaskDidFinish]'. En mi aplicación al final de 'doSomeLongTask', modifico una variable para indicar que se puede presionar un botón.¿Cambiaría la variable en '[self longTaskDidFinish]' en lugar de cambiarla justo después de hacer '[self doSomeLongTask]' – Roymunson

6

Quizás lo mejor que se puede hacer es this tutorial from Apple. Lo leí cuidadosamente (10-20 minutos) y "enhebré" toda mi aplicación. ¡Excelente!

0

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 darle a su subproceso de fondo:

  • .userInteractive (prioridad más alta)
  • .userInitiated (cuando se puede prescindir de algunos segundos)
  • .utility (cuando se puede prescindir de unos pocos segundos a unos pocos minutos)
  • .background (prioridad más baja - minutos/horas de sobra)