2012-08-16 19 views
14

Necesito detener una NSOperation en ejecución que se insertó en un NSOperationQueue. Actualmente cancelo todas las operaciones y las reinicio. Pero esto llevaría a algún tipo de duplicación en términos del proceso realizado. Intenté con el indicador setSuspended de NSOperationQueue. Pero no suspende la operación. ¿Hay alguna manera de salir?¿Cómo puedo pausar una NSOperation en un NSOperationQueue?

Respuesta

10

ver esto: Link

Y aquí desde el apple docs:

Suspendiendo y colas Reanudación Si desea emitir un cese temporal de la ejecución de las operaciones, se puede suspender la cola de operaciones correspondiente usando el método setSuspended:

Suspender una cola no provoca que las operaciones que ya se están ejecutando se detengan en el medio de sus tareas. Simplemente evita que las nuevas operaciones se programen para su ejecución. Puede suspender una cola en respuesta a una solicitud del usuario para pausar cualquier trabajo en curso, porque la expectativa es que el usuario eventualmente quiera reanudar ese trabajo.

+0

Gracias! Traté de implementarlo desde tu enlace. Agregué una nueva variable llamada 'isPaused' dentro de NSOperation y cada vez que necesito pausar la operación, estableceré su valor en YES. Dentro de NSOperation verificare regularmente el valor de 'isPaused'. Siempre que lo encuentre en "SÍ" saldré del círculo. Pero tengo un problema serio aquí. Estoy tratando de establecer el valor de 'isPaused' del hilo principal. Esto puede conducir a algunas condiciones de carrera. ¿Hay alguna manera de deshacerse de las condiciones de carrera? ¿Hay alguna manera de llamar a los métodos (pausar y reanudar) en el mismo hilo (en lugar del hilo principal)? – Advaith

+1

@Advaith: Si ambos hilos bloquean un mutex antes de leer o escribir en 'isPaused', no tendrás que preocuparte por las carreras. –

3

no he intentado esto, pero probablemente comience aquí:

  • añadir una bandera isPaused a su NSOperation subclase
  • poner en práctica un método de copiar/mover los datos de la operación
  • Si pausa, (ver para este cambio en -main)
  • crear una nueva operación de mover el estado de la operación se detuvo a nueva operación
  • ajustar la prioridad para reordenar orden de operación en la cola, si se quiere
  • añadir el clon a la cola
  • regreso de -main si en -main

en cuenta que esto sólo suspenderlo. si realmente desea pausar y reanudar de forma explícita, 'nueva operación' manualmente cuando quiera reanudar.

ahora, si usted está observando o tiene terminaciones especiales, entonces tendrá algunos otros problemas. para casos simples, parece que este enfoque parece funcionar bien.

Cuestiones relacionadas