2012-10-22 57 views
0

我正在使用核心數據庫將我從Web服務獲取的數據保存到我的應用程序中。但是這非常慢。任何想法如何來到?我做的是以下。我有一個從Web服務獲取數據的類。就像你可以在這裏看到的一樣。數據需要10分鐘才能將數據加載到核心數據庫中

 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"]; 
} 

然後在我的第一個視圖控制器顯示我有一個方法,用於在我的核心數據庫中獲取我的數據。

- (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"); 
} 

接下來我有一個新聞的NSManagerd對象的子類的類別,我做了以下。

+ (News *)newsWithGenkInfo:(NSDictionary *)genkInfo 
    inManagedObjectContext:(NSManagedObjectContext *)context 
       withNewsId:(int)newsId 
{ 
    News *news = nil; 

    news = [NSEntityDescription insertNewObjectForEntityForName:@"News" 
                inManagedObjectContext:context]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"dd/MM/yyyy"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT+0:00"]]; 
     NSDate *date = [dateFormatter dateFromString:[genkInfo objectForKey:NEWS_DATE]]; 
     news.title    = [genkInfo objectForKey:NEWS_TITLE]; 
     news.date    = date; 
     news.genk_description = [genkInfo objectForKey:NEWS_DESCRIPTION]; 
     news.imgurl    = [genkInfo objectForKey:NEWS_IMGURL]; 
     news.shortdescription = [genkInfo objectForKey:NEWS_SHORTDESCRIPTION]; 
     news.url    = [genkInfo objectForKey:NEWS_URL]; 
     news.imagecopyright  = [genkInfo objectForKey:NEWS_IMAGECOPYRIGHT]; 
     news.news_id   = [NSNumber numberWithInt:newsId]; 

    return news; 

} 

我正在爲10個不同實體做10次以下過程。所有這些屬性大多是字符串。仍然需要10分鐘才能加載所有數據。有人能幫助我嗎?

親切的問候。

+1

您是否嘗試過運行剖析,看看哪個部分佔用了大部分時間?這不應該接近10分鐘。 – Dima

+0

[Apple WWDC 2012:Session 211 - 在iOS上構建併發用戶界面](http://www.youtube.com/watch?v=cJK3GSWILIw)視頻顯示了一些非常好用的時間分析器來診斷性能問題。相關位在視頻中的4點之後開始。 – Dima

+0

@迪瑪感謝您的回答,但我該怎麼做? –

回答

0

與剖析檢查迪馬的回答幫我這個問題,解決了我的問題