Singleton Download Manager?

Uno de los controlleres de vista en mi aplicación permite la descarga de files desde un server. Pero un usuario puede navegar a este controller de vista, presionar el button "Descargar" y luego regresar a un controller de vista anterior. Si vuelven a navegar al controller de vista que tiene el button Descargar, deberían ver el progreso, o incluso ver que la descarga se ha completado.

Por lo tanto, me parece que el controller de vista en sí mismo no puede contener ninguna reference a la operación de descarga, lo que creo que sería una subclass de NSOperation que manejaría las cosas de NSURLConnection, ni podría ser el propietario del NSOperationQueue al que llegan las operaciones añadido a.

¿No requiere esta situación un gestor de descargas Singleton? A menudo veo que los solteros se desaniman, pero ¿de qué otra forma podría hacer esto? Nuevamente, las descargas se pueden iniciar en controlleres de vista que podrían desasignarse en cualquier momento. Una vez que se inicia una descarga, debe terminar sin importar si el usuario dejó la pantalla o no. Quiero download todo directamente al disco (no en la memory). Luego, cuando un usuario llega a dicho controller de vista, reviso el administrador de descargas para ver si las descargas relevantes están terminadas, en progreso o nunca comenzaron a downloadse.

Creo que este es uno de los pocos casos en que se puede usar un patrón único. Se ajusta exactamente a la descripción singleton (a través de Wikipedia ):

En ingeniería de software, el patrón singleton es un patrón de layout que restringe la Instantiación de una class a un object. Esto es útil cuando se necesita exactamente un object para coordinar las acciones en todo el sistema.

Lo hago de esta manera en mis aplicaciones y lo he visto hacer por otros, por ejemplo:

  • Cómo sincronizar datos principales con un service web
  • Progtwigción IOS: Guía de Big Nerd Ranch (capítulo 28)

Esta publicación puede ser de su interés. Cada aplicación de iOS viene con un singleton (AppDelegate), por lo que su class podría ser solo una single instance , a la que hace reference la AppDelegate.

Usaría un singleton Solo cuide cuando / donde usa singletons. Sea precavido y piense en la situación antes de usar uno.

Tenga cuidado con sus callbacks para el progreso / finalización de la descarga porque el singleton sobrevivirá a los controlleres de vista que realizan requestes. Los controlleres de vista necesitan gestionar sus 'observaciones' adecuadamente.