2015-10-27 1 views
2

Je développe une application qui télécharge un produit (JSON) sur le serveur. Maintenant, chaque objet produit consiste en plusieurs images. Un produit est uniquement téléchargé sur le serveur si toutes les images associées à ce produit ont déjà été téléchargées. Dans le cas où toutes les images pour le produit n'ont pas été téléchargées, le produit doit être stocké dans l'état «PENDING» dans la base de données mobile (j'utilise Realm). Je veux une tâche d'arrière-plan pour périodiquement (toutes les 15 minutes) vérifier la DB pour de tels téléchargements de produits échoués, vérifier si toutes les images associées au produit ont été téléchargées et mettre en file d'attente le produit pour le télécharger sur le serveur.Swift 2.0: Planifier une tâche en arrière-plan pour télécharger des téléchargements de produits ayant échoué

Cette tâche d'arrière-plan s'exécutera UNIQUEMENT lorsque l'application est en cours d'exécution, pas autrement. La tâche devrait être lancée au démarrage et tuée sur l'application à proximité.

J'ai trouvé quelques solutions pertinentes (relatives aux modes NSTimer et arrière-plan dans iOS, etc.) mais rien ne résout directement mon problème. S'il vous plaît, dirigez-moi dans la bonne direction! Merci!

Répondre

1

Les modes d'arrière-plan sont utiles lorsque vous avez besoin d'exécuter des tâches en arrière-plan lorsque l'application n'est pas en cours d'exécution, donc ce n'est pas ce que vous voulez. NSTimer peut faire un travail ici et vous devez le programmer après que l'application devienne active dans le délégué de l'application et l'invalider juste après que l'application soit passée en arrière-plan. Un exemple simple pourrait ressembler à ceci:

var timer:NSTimer! 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 

    timer = NSTimer.scheduledTimerWithTimeInterval(60 * 15, target: self, selector: "uploadData", userInfo: nil, repeats: true) 

    return true 
} 

func applicationDidEnterBackground(application: UIApplication) { 
    timer.invalidate() 
} 

func applicationWillEnterForeground(application: UIApplication) { 
    timer = NSTimer.scheduledTimerWithTimeInterval(60 * 15, target: self, selector: "uploadData", userInfo: nil, repeats: true) 
} 

func uploadData(){ 

    // Query unsychronzied data and send them to server here 
} 
+0

Awesome bro! Exactement ce que je cherchais! Merci! : D Ce qui me préoccupe cependant, c'est la performance. Une telle minuterie affectera-t-elle la performance? – dashbashrumble

+0

Je ne pense pas. Si le sélecteur est appelé une fois en 15 minutes, il ne peut pas affecter les performances de l'application (en supposant que le transfert s'effectuera simplement par un simple report). Aussi le processus de téléchargement sera exécuté sur le fil d'arrière-plan alors ne vous inquiétez pas de la performance –

+0

Cool, ça sonne bien! Merci encore! :) – dashbashrumble