usando begin Background Task With Expiration Handler para cargar

Desde el file doc parece que cargar un file es un buen caso de uso para begin​Background​Task​With​Expiration​Handler​ usar la begin​Background​Task​With​Expiration​Handler​ He encontrado que usar

 let uploadTask = session.uploadTask(with: request as URLRequest, fromFile: file) uploadTask.resume() 

ya se ejecutará mientras la aplicación esté en segundo plano (estoy recibiendo pings de progreso de carga por un time). Además, puedo configurar la URLSession para ser en segundo plano:

 let config = URLSessionConfiguration.background(withIdentifier: "uploads") session = URLSession(configuration: config, delegate: self, delegateQueue: nil) 

Entonces, ¿cuál es la ventaja de usar begin​Background​Task​With​Expiration​Handler ? ¿Se extenderá el time que tengo para terminar mi carga? Si es así, ¿puedo saber por cuánto (no vi nada sobre esto en el documento)? ¿O es que recibiré un ping antes de que la aplicación se detenga? ¿Debería usarlo en combinación con una URLSession en segundo plano?

Además, el documento dice que se llamará al controller poco antes de que el time de background restante de la aplicación scope 0 ¿Significa que la aplicación finalizará después de eso? es decir, ¿puedo suponer que la próxima llamada será la application:didFinishLaunchingWithOptions o puede ser applicationDidBecomeActive ?

Esta tarea en segundo plano permitirá que su aplicación continúe ejecutándose en segundo plano después de que el usuario abandone su aplicación durante unos 3 minutos adicionales (controle el background​Time​Remaining en el background​Time​Remaining para get un valor real) para que su request finalice. Y, sí, cerca del final de esos 3 minutos, se llamará al manejador de time de espera si aún no ha finalizado la tarea de background.

Por lo tanto, si finaliza la tarea de background durante el flujo normal de su aplicación, no será necesario cerrar este cierre de time de espera. Este cierre es únicamente para una limpieza rápida y de último minuto, que puede necesitar hacer antes de que la aplicación deje de ejecutarse en segundo plano porque se agotó antes de tener la oportunidad de indicar que la tarea de background finalizó. No es para comenzar algo nuevo, sino cualquier limpieza en el último segundo. Y asegúrese de finalizar la tarea de background en este controller de time de espera … si no finaliza la tarea de background, el sistema operativo eliminará su aplicación de forma sumria en lugar de simplemente suspenderla. A menudo, lo único que necesita hacer en este cierre de time de espera es finalizar la tarea de background, pero si necesita hacer otra limpieza, aquí es donde puede hacerlo.

Huelga decir que debe finalizar su tarea en segundo plano (cuando finalice la request de networking o en el manejador de time de espera si su aplicación aún no tuvo la oportunidad de finalizar la tarea de background en su flujo normal). Si no lo hace, su aplicación no será suspendida, sino que será asesinada.

En cuanto a hacer suposiciones acerca de lo que sucede cuando el usuario reinicia su aplicación más tarde, no puede hacer ninguna asunción sobre qué método de delegado de la aplicación se invocará. Incluso si terminó con gracia la tarea de background, no tiene garantías de que no será expulsado por otros motivos (p. Ej., Presión de la memory). Entonces, no asums nada.

Entonces, ¿cuál es la ventaja de usar begin Background Task With Expiration Handler?

Si va a usar URLSessionConfiguration.background , no existe tal ventaja y no debería usar beginBackgroundTask(expirationHandler:) en absoluto. Toda tu premisa (tu primera oración) fue incorrecta. Cargar un file no es un buen caso de uso para beginBackgroundTask(expirationHandler:) . Es un buen caso de uso para URLSessionConfiguration.background . Las dos cosas no tienen nada que ver el uno con el otro.

    Intereting Posts