2009-08-19 17 views
7

Tengo una aplicación para iPhone que usa servicios web para obtener datos de un servidor. Pongo cada llamada al servicio web en una subclase de NSOperation para que se pueda enhebrar. Mi pregunta es, ¿cuál es la forma recomendada de devolver información de una subclase de NSOperation completada? Actualmente estoy enviando un NSNotification al final de mi método principal y cualquier código que esté esperando que se complete la NSOperation se suscribe a la notificación. Y luego usaré la parte del objeto de NSNotificationWithName: Object: para pasar información de la operación.Cacao - Devolver información de NSOperation

No estaba seguro de si había una mejor manera de hacerlo. He oído hablar de Key Value Coding y luego podría usar Key Value Observing para detectar cuándo se modificó la propiedad de isFinished para la operación, pero no estoy seguro de cuál es la mejor práctica.

También estoy tratando de asegurar que mi aplicación sea segura para subprocesos, lo cual supongo que no sería un problema siempre que se enviara una notificación al final del método principal, así el objeto en la notificación ya no se usa en el hilo ya que terminará.

Finalmente, llamo de la notificación de esta manera:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:[NSNotification notificationWithName:@"notificationName" object:dataObject] waitUntilDone:NO]; 

Respuesta

16

He hecho personalmente esto de dos maneras. Ambos funcionaron bastante bien.

primera forma

Usted puede tener una función que devuelve la "salida", y llamar a esa función después de la operación ha terminado. Puede observar la clave isFinished en el objeto NSOperation, o usar -[NSOperationQueue waitUntilAllOperationsAreFinished] para determinar cuándo finaliza la operación.

segunda forma

Puede utilizar un delegado o de destino/acción por parte del NSOperation. Solo asegúrese de que cuando llama a la función de delegado o activa el objetivo/acción, lo hace en el hilo principal usando -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

1

Depende de su aplicación. ¿Cuántas de las operaciones espera ejecutar simultáneamente? ¿Qué estás haciendo con el resultado? ¿Los resultados se agregan o deben mostrarse en la interfaz de usuario de inmediato?

El envío de notificaciones en el hilo principal es bastante pesado. Dependiendo de lo que esté haciendo con el resultado, puede obstruir su UI. Desde una perspectiva de diseño, ¿los objetos que enviaría de la notificación serían algo que la clase observadora debería conocer? Puede tener más sentido realizar cambios en los objetos de su modelo desde la operación y hacer que un objeto controlador observe esos cambios en su lugar.

Puede usar Key Value Observing, pero debe tener cuidado. El observador observa en el mismo hilo que se produce el cambio, por lo que no debe realizar cambios en la UI directamente cuando finaliza la observación.

Si el objeto solo pertenece y es usado por la operación, entonces sí, debe ser seguro enviarlo al final de la página principal. Será retenido por la notificación.

0

El documento dice que es mejor hacer que el miembro de la operación sea variable cuando desee obtener el resultado de operación. Pero no creo que la solución te adapte.

Creo que la notificación es buena y hay otra manera de obtener el resultado es hacer un bloque de finalización para su propia operación.Vea aquí: Return data from NSOperation? Intenté que funcionara bien.

he intentado otra forma before.set el bloque de terminación de la operación, y crea una referencia débil para la operación y que el resultado sea una propiedad de la operación. para que pueda obtener el resultado de la operación cuando haya terminado.

Pero finalización no es confiable, cuando se cancela la operación de la realización excuted también. así que elige lo mejor para ti.

+0

el doc es es posible que les guste. – frank