1

私のアプリケーションは Web サービスを使用し、json でデータを取得する必要があります。json を解析し、永続ストアにデータをフィードする必要があります。実際のデバイスでアプリケーションをテストするまで、すべてがうまく機能していました。アプリケーションは、イライラするまでそれを保持しているように見え、最後に顔にうんちをしました x -(

ここにinsertOrReplaceObjectForEntityForNameのメソッドがあります

+(id) insertOrReplaceObjectForEntityForName:(NSString *)entityName inManagedObjectContext:_context WithPredicateString:(NSString *)predicateString, ...{

    NSManagedObject *object;

    va_list ap;
    va_start(ap, predicateString);

    NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:entityName];
    NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString arguments:ap];
    [req setPredicate:pred];

    int count = [_context countForFetchRequest:req error:nil];

    if(count > 0){
        NSArray *arr = [_context executeFetchRequest:req error:nil];
        object = [arr objectAtIndex:0];
    }
    else{
        object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:_context];
    }

    va_end(ap);

    return object;
}

ここでは、1 行の単純な操作に約 0.004 秒かかります。データの解析では、この操作を他の多くの操作と組み合わせて約 1000 回実行する必要があるため、解析が非常に重いプロセスになります。デフォルトのデータベースにはすでに多くの薬があり、薬が存在するかどうかを確認する必要があり、存在する場合はその値を編集する必要があります。

Drug *drug = [NSEntityDescription insertOrReplaceObjectForEntityForName:@"Drug" inManagedObjectContext:parsingContext WithPredicateString:[NSString stringWithFormat:@"drugId == '%@'",[drugDetails objectForKey:@"DrugId"]]];

アプリケーションで履歴を保持するためにコア データを使用していましたが、コア データから離れて履歴を保持することを忘れる必要があると思います。私はすでにアプリケーションの作成に多くの時間を費やしてきましたが、クライアントが足を引っ張っています。何か提案はありますか??

4

1 に答える 1

1

ヨゲシュ、

表示されている遅延は、特に Core Data によるものではなく、iOS デバイスのフラッシュの速度が遅いためです。これをどのように軽減しますか?

Flash は非常に大きなブロック (128kB と言われています) を読み取り、DB スキャッター ギャザー操作でそれらを破棄する必要があります。したがって、各フェッチからできるだけ多くのデータを取得する必要があります。

あなたのコードは、json の項目ごとにフェッチを行います。私のアプリで使用しているように、Instruments の低レベル ツールを使用した場合、ほとんどの場合、アプリはアイドル状態でフラ​​ッシュを待機していることがわかります。

in述語演算子を使用して集約フェッチを作成します。drugIDIOW、すべてのをセットまたは配列に集めに行きます。ところで、json によっては、-valueForKey:. この述語形式のように:

@"drugId in'%@'", [drugDetails valueForKey:@"DrugId"]

drugDetailsオブジェクトの配列です。この検索により、DB はすべてのページ フェッチを集約できます。次に、既に存在するレコードの配列を返します。その後、セット操作を使用して、必要に応じてレコードを更新または作成することを簡単に選択できます。次に、それらをフラッシュして単一の-save:.

アンドリュー

于 2012-05-08T15:08:23.750 に答える