2015-09-01 2 views
-1

J'ai NSURLSession, qui télécharge de nouveaux profils utilisateur à partir du serveur, puis pour chaque profil télécharge tableau de photos, et que stocke dans les données de base. Chaque fois que l'utilisateur atteint cet écran, j'arrête de télécharger des tâches, d'effacer les données de base, puis de le remplir à nouveau. Le problème est que la fonction cancel() est asynchrone, de sorte qu'elle parvient à enregistrer certains profils APRÈS avoir effacé les données de base. De plus, ces profils peuvent être sans données grâce à l'annulation de la donnée. Donc, la question est la suivante - comment finir correctement les tâches de téléchargement et après cela effacer les données de base? Merci d'avance.NSURLSessionDataTask annuler et les données de base

Répondre

2

Je recommanderais d'utiliser la classe NSOperation pour ce dont vous avez besoin.

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/

Vous devriez wrap-up opération pour le téléchargement de données en classe NSOperation et avant d'ajouter les résultats à CoreData vous pouvez vérifier si NSOperation a été annulé entre les deux.

@interface DownloadOperation: NSOperation 
@end 

@implementation DownloadOperation 
- (void)main { 
    @autoreleasepool { 
     [Server downloadDataFromServer:^(id results) { 
      if (self.isCancelled == NO) 
      { 
       [CoreData saveResults:results]; 
      } 
     }]; 
    } 
} 
@end 

Vous ajoutez votre opération à NSOperationQueue:

NSOperationQueue *queue= [[NSOperationQueue alloc] init]; 
[queue addOperation:[[DownloadOperation alloc] init]]; 

Et vous pouvez l'annuler en appelant:

[operation cancel]; 

ou d'annuler toutes les opérations:

[queue cancelAllOperations]; 
+0

Eh bien, je comprendre. Mais il y a encore un problème. Lorsque l'utilisateur quitte rapidement le contrôleur de vue de collection et le charge à nouveau - je supprime des objets des données de base, mais l'ancienne instance de contrôleur continue de créer une vue de collection pendant quelques secondes avant deinit, il essaie de charger les modèles supprimés. crash. Comment puis-je faire face à cela? –