2012-10-22 2 views
0

Je travaille avec une base de données de base pour enregistrer mes données que je récupère d'un service web dans mon application. Mais c'est très très lent. Une idée de comment cela vient? Ce que je fais est le suivant. J'ai un cours pour obtenir les données du webservice. comme vous pouvez le voir ici.données nécessaires 10 min pour charger les données dans la base de données de base

 GenkData.h 

      + (NSArray *)getNews; 
    GenkData.m 
+ (NSDictionary *)executeGenkFetch:(NSString *)query 
{ 
    query = [NSString stringWithFormat:@"%@", query]; 
    query = [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    // NSLog(@"[%@ %@] sent %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), query); 
    NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding]; 
    NSError *error = nil; 
    NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil; 
    if (error) NSLog(@"[%@ %@] JSON error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), error.localizedDescription); 
    // NSLog(@"[%@ %@] received %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), results); 
    return results; 
} 

+ (NSArray *)getNews 
{ 
    NSString *request = [NSString stringWithFormat:@"http://www.krcgenk.be/mobile/json/request/news/type/ipad"]; 
    return [[self executeGenkFetch:request] valueForKey:@"news"]; 
} 

Ensuite, dans mon premier contrôleur de vue qui apparaît, j'ai une méthode qui pour aller chercher mes données dans ma base de données de base.

- (void)fetchGenkDataIntoDocument:(UIManagedDocument *)document 
{ 
    NSLog(@"Fetch data"); 
    dispatch_queue_t fetchQ = dispatch_queue_create("Genk fetcher", NULL); 
    dispatch_async(fetchQ, ^{ 

     NSArray *news   = [GenkData getNews]; 

     [document.managedObjectContext performBlock:^{ // perform in the NSMOC's safe thread (main thread) 

      int newsId   = 0; 
      //int trainingIndex = -1; 
      for (NSDictionary *genkInfo in news) { 
       NSLog(@"Begint met nieuwsitem"); 
       newsId++; 
       [News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId]; 
       NSLog(@"Einde met nieuwsitem"); 
      } 
}]; 
    }); 
    NSLog(@"einde fethdata"); 
} 

Ensuite, je possède une catégorie de la sous-classe d'objet NSManagerd de nouvelles où je fais ce qui suit. Je fais le processus suivant comme 10 fois pour 10 entités différentes. Tous ces attributs sont principalement des chaînes. Cependant, cela prend jusqu'à 10 minutes pour charger toutes les données. Quelqu'un peut-il m'aider?

Cordialement.

+1

Avez-vous essayé de courir le profileur pour voir quelle partie prend la majeure partie du temps? Cela ne devrait pas prendre même près de 10 minutes. – Dima

+0

La vidéo [Apple WWDC 2012: Session 211 - Création d'interfaces utilisateur simultanées sous iOS] (http://www.youtube.com/watch?v=cJK3GSWILIw) montre une très bonne utilisation du profileur de temps pour diagnostiquer les problèmes de performance. Le bit correspondant commence juste après 4h00 dans la vidéo. – Dima

+0

@Dima Merci pour votre réponse, mais comment puis-je faire cela? –

Répondre

0

réponse de Dima de vérifier avec le profileur m'a aidé à cette question et a résolu mon problème

Questions connexes