2016-05-04 5 views
-1

私はRealmとObjective-Cの新機能です。私はすでにJSON配列を読み込んでRealmに解析するアプリケーションを持っています。うまく動作しますが、20,000を超えるオブジェクトを解析するには2分30分かかります。私は短い時間で解析を行う必要があります。IOS(Objective-C)でJSONとRealm DBを効率的に解析します。

これは私のJSONの構造である:2

{"resultados":[ 
    { 
    "id": 1, 
    "tipo": 9, 
    "titulo": "name tittle curso", 
    "id_padreactividad": 0, 
    "hora": "16:55-20:30", 
    "fecha": "15/02/2015", 
    "acreditado": "Sí", 
    "num_creditos": 0.5, 
    "ubicacion": 2, 
    "tema": "null", 
    "patrocinadorId": 0 
    }, 
    { 
    "id": 2, 
    "tipo": 16, 
    "titulo": "Apertura e Introducción\n", 
    "id_padreactividad": 1, 
    "hora": "16:55-17:00", 
    "fecha": "15/02/2015", 
    "num_creditos": 0.0, 
    "ubicacion": 2, 
    "tema": "null", 
    "patrocinadorId": 0, 
    "descripcion": "null" 
    },ect... 

そして、これがこの作品の罰金レルムにJSONから

//obtenemos los datos del json con esta simple estructura 
    NSData *allCoursesData = [[NSData alloc] initWithContentsOfURL: 
           [NSURL URLWithString:@"String-for-http-direction-to-json"]]; 

    NSError *error; 
    //hacemos el parseo del json, el error está creado por si fallara para que no siga 
    NSMutableDictionary *allCourses = [NSJSONSerialization 
             JSONObjectWithData:allCoursesData 
             options:NSJSONReadingMutableContainers 
             error:&error]; 

    if(error) 
    { 
     NSLog(@"%@", [error localizedDescription]); 
    } 
    else { 
     NSArray *resultado = allCourses[@"resultados"]; 
     total=[resultado count]; 


     for (NSDictionary *theCourse in resultado) 
     { 
      // NSLog(@"Insertando actividad...%d",contador); 
      NSLog(@"%d/%d",progress,total); 
      contador=contador+1; 


      Objeto=[[ActividadBean alloc] init]; 

      Objeto.id_act = [theCourse[@"id"] intValue]; 
      Objeto.tipo = [theCourse[@"tipo"]intValue]; 
      Objeto.titulo = theCourse[@"titulo"]; 
      Objeto.id_padreactividad = [theCourse[@"id_padreactividad"]intValue]; 
      Objeto.hora = theCourse[@"hora"]; 
      Objeto.fecha = theCourse[@"fecha"]; 
      Objeto.acreditado = theCourse[@"acreditado"]; 
      Objeto.num_creditos = [theCourse[@"num_creditos"] floatValue]; 
      Objeto.ubicacion = [theCourse[@"ubicacion"] intValue]; 
      Objeto.tema = theCourse[@"tema"]; 
      Objeto.patrocinadorId=[theCourse[@"patrocinadorId"]intValue]; 
      //guardamos el objeto 
      [Objeto save]; 
     } 
    } 

を解析するために私のコードで、すべてが問題なくインポートされますが(いくつかの時間がかかります:20000回以上の解析のための30分)私はJavaが "createAllFromJson"メソッドを持っていることを知っていますが、IOSに何かそんなものがあるかどうかは分かりません。

答えて

0

allCourses辞書の作成にはどの部分が費やされますか?ローカルソースまたはリモートソースからJSONを取得しているかどうかは不明です。この長さのプロセスに貢献する可能性があります。

JSONの逆シリアル化にかなりの時間がかかる場合は、代替JSONパーサー、またはより効率的なデータ形式(Realm、BSONなど)を使用して調べることができます。

サンプルに[Objeto save]の呼び出しもあります。これは、20.000コレクションの各アイテムの新しい書き込みトランザクションを作成すると思われますが、これはレルムに大きなオーバーヘッドがあります。代わりに、Realmのトランザクション書き込みモデルを利用し、すべての20.000個のアイテムを1回の書き込みトランザクションで書き込む必要があります。これにより、Realmの部分がスピードアップされます。


Instruments.appに含まれている「タイムプロファイラ」を使用して、コードがほとんどの時間を費やす場所を特定することを強くお勧めします。これは、あなたのコードが時間を費やしているかもしれないと推測するために、インターネット上で見知らぬ人を得るためにStack Overflowを尋ねるのではなく、将来の時間を節約します;)

+0

ありがとう!あなたは正しいです、保存メソッドが問題だった、私は(そして閉じる)すべてのオブジェクトのトランザクションを開いて、単一の書き込みトランザクションはすべて正常に動作します! –

関連する問題