NSURLSessionDownloadTask cancelByProducingResumeData vs suspend

Necesito pausar las tareas de descarga y reanudarlo incluso después de reiniciar la aplicación. Pero no estoy seguro de qué método debo usar, suspend o cancelByProducingResumeData .

Con cancelByProducingResumeData puedo get los datos parcialmente descargados y volver a crear la tarea de descarga con él. Sin embargo, tengo que administrar manualmente los datos, savelos en el file, leerlos y volver a crear la tarea y asegurar que la nueva tarea no falle.

Con la suspend , puedo pausar y reanudar la tarea de descarga. ¿Pero puedo reanudar esta tarea después de reiniciar la aplicación? Estoy usando la session en segundo plano para que las tareas se conserven durante el reinicio.

cancelByProducingResumeData tiene requisitos para que funcione, ¿esos requisitos también se aplican a suspend / resume ? ¿O suspend / resume solo significa "suspender temporalmente una tarea" como dice el documento?

Estás pensando demasiado en el problema. Los "datos de reanudación" para una tarea de descarga no son los datos que la tarea ha recibido hasta ese momento. Es una pequeña gota de datos de contabilidad, el tipo de cosa que normalmente arrojarías a una matriz en NSUserDefaults .

Dicho esto, para responder a la pregunta original, una tarea solo es válida dentro del context de una session. Entonces, para una session de primer plano, una vez que la aplicación se cierra, la session deja de existir, por lo que ya no es posible acceder a las tareas en esa session. Por lo tanto, no es posible reanudar una tarea suspendida después de reiniciar la aplicación porque la tarea ya no existe (porque su session ya no existe).

Para una session en segundo plano, casi tendría que pedirle a alguien del equipo de Networking Foundation que obtenga una respuesta, ya que depende del grado en que pueda volver a crear una session después del hecho. Sin embargo, mi conjetura es que probablemente tampoco funcione allí, y si lo hace, debería considerar que no es compatible.

Después de una investigación sobre los formularios de desarrollo de Apple, encontré esto

La suspensión de tareas rara vez se utiliza y, cuando es así, se utiliza principalmente para desactivar temporalmente devoluciones de llamada como parte de algún tipo de sistema de control de concurrency. Esto se debe a que una tarea suspendida puede estar activa en el cable; todo lo que hace la suspensión es evitar que progrese internamente, emitiendo devoluciones de llamada, etc.

OTOH, si está implementando una pausa a largo ploop (por ejemplo, el usuario quiere pausar una descarga), sería mejor llamar -cancelByProducingResumeData :.

Por lo tanto, suspend puede no dejar de download y debería usar cancelByProducingResumeData: para una pausa a largo ploop.