0

コアデータベースを使用して、Webサービスから取得したデータをアプリに保存しています。しかし、これは非常に遅いです。これがどうやって来るのか分かりますか?私がしていることは次のとおりです。Webサービスからデータを取得するためのクラスがあります。あなたがここで見ることができるように。

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

次に、表示される最初のView Controllerに、コアデータベースのデータをフェッチするためのメソッドがあります。

- (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分かかります。誰かが私を助けることができますか?

敬具。

4

1 に答える 1

0

プロファイラーで確認するというディマの答えは、この質問に役立ち、私の問題を解決しました

于 2012-10-30T15:51:10.353 に答える