Tengo un bloque de código que se accede con frecuencia y desde el hilo principal o varios subprocesos en segundo plano. Necesito para asegurarse de que este código sólo se procesa de una en una.

Actualmente estoy usando un @synchronized(self) { } de bloque, pero no estoy seguro de si eso es proporcionar la protección adecuada. ¿Cómo se diferencia de un NSLock instancia?

Por último, ¿alguien puede sugerir cómo puedo proteger mi método? El método es en mi aplicación delegado, y puedo acceder desde varios subprocesos, llamando al:

[[[UIApplication sharedApplication] delegate] myMethod];

Muchas gracias,

Mike

2 Comentarios

  1. 31

    Hay una gran entrada en el Blog sobre el Google Mac de blog sobre el funcionamiento interno de @synchronized:

    http://googlemac.blogspot.com/2006/10/synchronized-swimming.html

    Actualmente estoy usando un
    @sincronizado(auto) { } bloque, pero estoy
    no estoy seguro si que proporciona la
    correcta protección. En qué se diferencian
    a partir de un NSLock instancia?

    Hay varias maneras de sincronizar las secciones críticas (@sincronizado, NSLock, OSSpinLock, …).

    Creo que @synchronized es el más conveniente (y también el más lento) enfoque.

    Aquí es un buen MODO de respuesta que explica las diferencias entre @sincronizado y NSLock.

    Que accede a su método a través de una instancias compartidas (que básicamente es un singleton) delegado. Tal vez usted puede reconsiderar su diseño y averiguar de una manera que le permite bloquear una pequeña pieza de código dentro de myMethod.

    • Gracias por su ayuda! Es correcto utilizar siempre self? Yo en este caso se apuntan a la aplicación de delegado, no importa lo que está llamando? Estoy confundido en cuanto a por qué usted tiene que pasar algo dentro de ella!
    • Utilice la (auto) si desea bloquear «por ejemplo» y [YourClass clase] si desea bloquear «por clase». la (auto) significa que la ejecución de la sección crítica debe ser sincronizado para la actual (particular) objeto.
    • Ahhh, ¡lo tengo! Muchísimas gracias 🙂
  2. 16

    Si realmente tienen algo que usted quiere ser procesado un elemento en un tiempo, mi recomendación es utilizar NSOperations y un NSOperationQueue donde se ha establecido la maxConcurrentOperationCount a 1. Si usted asegúrese de que la única manera de que esta compartido el bloque de código que se tiene acceso es a través de las operaciones en esta cola, vas a acabar con la necesidad de costosos de cerraduras.

    Esto puede requerir un poco de reorganización de su aplicación, pero he encontrado que la aplicación de este dentro de mis propias aplicaciones ha llevado a un mejor rendimiento y un código más limpio.

    • +1, sin embargo, uno debe darse cuenta de que el ‘pequeño reorganización» requeriría que el código para ser completamente asíncrona en la naturaleza. @sincronizado está destinado a ser un sincrónica de bloqueo, mientras que el uso de una cola significaría el llamado sitio no debe esperar un valor devuelto pero en lugar de utilizar el bloque de devoluciones de llamada para el procesamiento de los resultados. Esto puede no ser ideal para las secciones críticas de su código, donde el bloqueo de llamadas que se espera.

Dejar respuesta

Please enter your comment!
Please enter your name here