2012-06-15 18 views
5

Mi aplicación descarga varios recursos del servidor, datos y descriptores de datos. Estas descargas, desencadenadas por acciones de los usuarios, pueden realizarse simultáneamente, digamos, hasta 50 descargas a la vez. Todas estas tareas asíncronas terminan creando objetos en la memoria (por ejemplo, agregando hojas a estructuras de datos, como agregar claves a diccionarios u objetos mutables en las matrices). Mi pregunta es: ¿esto puede causar problemas de estabilidad? Por ejemplo, si varias tareas simultáneas intentan agregar claves al mismo diccionario, ¿se supone que debo manejar la situación, colocando algún tipo de bloqueos? Si implemento un ciclo for que busca elementos gráficos en una matriz, ¿es posible que otras tareas en ejecución puedan cambiar el contenido de la matriz 'durante' el ciclo? ¿Alguna referencia o principal orientación general sobre este multitarea, problemas de subprocesos múltiples además de la documentación oficial?iOS - Acceso concurrente a los recursos de memoria

Respuesta

1

depende de cómo se está tratando con las descargas - si está utilizando NSURLConnection que se encarga de la rosca separada/concurrencia para usted y su código es reentrante por lo tanto usted no tiene que preocuparse por la acción simultánea. Si está creando sus propios hilos, posiblemente tenga problemas.

EDIT: Su código se ejecuta en un hilo principal (el ciclo de ejecución principal), supongamos que tiene una NSURLConnection que también se está ejecutando y luego se ejecutará en un hilo separado. Sin embargo, su código de delegado que se ocupa de los eventos que suceden mientras la conexión está en progreso se ejecuta en su bucle de ejecución, no en el otro. Esto significa que su código solo puede ejecutar una cosa a la vez. Un método de conexión exitosa no se llamará al mismo tiempo como cualquiera de sus otros códigos. Si tuviera un bucle for funcionando, bloquearía el hilo principal hasta que finalizara el bucle, mientras tanto, si la conexión finaliza mientras el bucle for aún se está ejecutando, su código de delegado no se ejecutará hasta después de que el bucle haya finalizado.

+0

Sí, estoy usando NSURLConnection. Imaginemos que tenemos un for-cycle en una matriz mutable, ¿qué ocurre si otra tarea (conexión exitosa) intenta agregar un objeto al final de la matriz, mientras se ejecuta el ciclo for? ¿Podría hacer un breve ejemplo de código de reentrada en este caso? – user236739

+0

Se agregaron unas cuantas oraciones más – Gruntcakes

+0

Genial, estas nuevas líneas realmente aclararon, gracias. – user236739

1

Es posible que desee examinar Grand Central Dispatch (GCD) y bloques de barrera. Los bloques de barrera te permitirán hacer lo que desees en segundo plano y "bloquear" los recursos.

Consulte la documentación de Apple y la publicación de Mike Ash en el blog here en GCD.

La esencia básica es que utiliza una cola concurrente que crea para realizar las lecturas y utiliza un bloque de barrera para bloquear todo el acceso a ese recurso para la escritura. buen material.

Buena suerte

Tim

Cuestiones relacionadas