Estoy desarrollando una aplicación para iPad y actualmente estoy luchando para encontrar el mejor enfoque para el multihilo. Permítanme ilustrar esto con un ejemplo simplificado:
Tengo una vista con 2 subvistas, un selector de directorio y una galería con miniaturas de todas las imágenes en el directorio seleccionado. Debido a que la 'descarga' y la generación de estas miniaturas puede llevar bastante tiempo, necesito multithreading para que la interacción y la actualización de la vista no se bloqueen.¿Cuál es el mejor método de subprocesamiento en el objetivo C?
Esto es lo que ya intentado:
[auto performSelectorInBackground: @selector (displayThumbnails :) withObject: CurrentFolder];
Esto funcionó bien porque las interacciones de los usuarios no se bloquearon, sin embargo falla de manera lamentable cuando el usuario toca otra carpeta mientras la primera carpeta aún se está cargando. Dos hilos intentan acceder a la misma vista y a las mismas variables, lo que da como resultado un error en la correcta ejecución de los demás. Cuando los usuarios tocan otra carpeta, el displayThumbnails
de la carpeta que se está cargando se abortará. No he encontrado ninguna manera de hacer esto ..
NSThreads
He intentado esto, pero tuvo problemas con casi los mismos problemas que con el primer método, no he encontrado una manera (fácil) para cancelar la método continuo. (Sí, sé de [aThread cancel]
pero no encontré la manera de 'reanudar' el hilo). Tal vez debería subclase NSThread
e implementar mis propios métodos isRunning, etc. Pero, ¿hay alguna otra forma mejor o una tercera (o incluso cuarta y quinta) opción que estoy pasando por alto?
Creo que este es un ejemplo bastante simple y creo que hay tal vez una mejor solución sin la subclasificación NSThread
. ¿Entonces, qué harías? Sus opiniones por favor!
Aparentemente no puedo dar una respuesta que solo dice "GCD" – JustSid
Estás completamente equivocado al respecto. Seriamente. – puzzle
Ver [aquí] (https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html%23//apple_ref/doc/uid/TP40008091-CH102-SW2) por qué GCD es tan genial :) O mejor aún, mira una de las sesiones WWDC :) Acerca de tu problema original: hay varias maneras de cancelar o pausar, sin importar si estás usando hilos, GCD o NSOperationQueue. Puede dormir, suspender, esperar en un bloqueo, cancelar por completo, etc. Creo que NSOperationQueue será una buena solución para usted en este momento, ya que lo guía automáticamente a una implementación razonable. – puzzle