2016-12-27 2 views
1

Dans le cadre de l'opération de synchronisation, je prends beaucoup de données de l'API en utilisant l'objet NSSession tel que recommandé par this answer:IOS: Après l'appel de l'API, les mises à jour des données de base peuvent-elles être effectuées dans le thread d'arrière-plan?

NSURLSession *session = [NSURLSession sharedSession]; 
     NSURLSessionDataTask *data = [session dataTaskWithURL:dataUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
      // use `Data` here 
      if (data !=nil) { 
      [self processData:data];//this currently includes saving to CoreData 
      } 
      // finally, any UI/model updates should happen on main queue 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       //do what you want with data 
       NSLog(@"back in main queue"); 
       if (data==nil) { 
        NSLog(@"no data from api"); 
       } 
       else { 
        [self.tableView setNeedsDisplay]; 
        [self.tableView reloadData]; 
       } 
      }); 
     }]; 

     [data resume]; 

Ma question est, est-il correct d'enregistrer les données à CoreData dans le fil d'arrière-plan, ou est-il préférable de le faire dans le bloc d'achèvement/thread principal? En ce moment je le fais dans le fil de fond. Cependant, il y a un long délai avant que la tableview se charge complètement et dans le cadre du dépannage, il m'est apparu que cela pourrait être le problème.

Nous vous remercions de votre suggestion.

Répondre

0

Vous ne devriez pas le faire sur le thread principal. Mais la façon dont vous devez l'implémenter dépend de votre pile de données de base et de ce que vous faites réellement dans votre fonction processData. En général, dans ces scénarios d'importation, il est recommandé d'effectuer l'opération de sauvegarde à partir d'un contexte enfant dans une file d'attente privée.

Apple a un exemple de code here.

Extrait de cette page:

Dans cet exemple, un tableau de données a été reçu à l'origine comme une charge utile JSON. Vous créez ensuite un nouveau NSManagedObjectContext défini comme une file d'attente privée. Le nouveau contexte est défini en tant qu'enfant du contexte de la file d'attente principale qui exécute l'application. De là, vous appelez performBlock: et faites la création réelle de NSManagedObject à l'intérieur du bloc qui est passé à performBlock :. Une fois que toutes les données ont été consommées et converties en instances NSManagedObject, vous appelez save sur le contexte privé, ce qui déplace toutes les modifications dans le contexte de la file d'attente principale sans bloquer la file d'attente principale.

+0

Ok. On dirait un ours. Je fais beaucoup de traitement, donc je vais devoir passer beaucoup de temps à déterminer quel MOC est utilisé. – Arjun

+0

Pour confirmer, processData devrait aller où montré ci-dessus? – Arjun

+0

Bon, travailler avec plusieurs GPM peut être pénible. Mais déterminer qui est utilisé est facile, car chaque MO a une référence (faible) à son MOC. Donc, sauf si vous avez libéré votre MOC, vous pouvez simplement vous référer au MOC de n'importe quel MO donné. –