1

以下のアクティビティをより効率的にする方法はありますか。

+ (NSMutableArray *)sortArrayOfOrdersByDate:(NSMutableArray *)array{

    //create an array of the dates from the Order class
    NSMutableArray *dates = [[NSMutableArray alloc] init];
    for (Order *order in array)
        [dates addObject:[Utility parseDateFromString:order.date format:@"MM-dd-yyyy HH:mm"]];

    //algorithm to sort the array of dates
    NSArray *datesSorted = [dates sortedArrayUsingComparator: 
        ^(id obj1, id obj2) {
             return [obj2 compare:obj1];
        }];

    //match and build a complete, sorted array of orders
    NSMutableArray *ordersSorted = [[NSMutableArray alloc] init];
    for (NSDate *theDate in datesSorted)
        for (Order *order in array)
            if ([[Utility parseStringFromDate:theDate format:@"MM-dd-yyyy HH:mm"] isEqualToString:order.date])
                [ordersSorted addObject:order];

    return ordersSorted;
}

何が起こっているのかを説明します。データベースから取得した Order というクラスがあります。
データベースは日時フィールドをサポートしていない SQLite であるため、クエリ内から日付で並べ替える簡単な方法はありません。これが、この関数を作成する方法です。

Order には「日付」というプロパティがあり、これは単なるテキストの文字列です。
このために、この値の日付解析バージョンを使用して NSDates の配列を作成しています。

日付を並べ替えてから、各日付の文字列解析バージョンを order.date に格納されているものと比較して、新しい配列を作成しようとします。

私のテスト データベースには約 80 件の注文があり、viewcontroller を開くボタンをタップするのにかなりの遅延があります。

これをより効率的にするのを手伝ってくれる人はいますか?

結果

@bbum のアドバイスに従って、プロパティを解析してデータベースから取得したときにorder.dateとして保存し、プロパティ間の簡単な比較を可能にする単純な呼び出しを使用しました。NSDatesortedArrayUsingComparator:order.date

解決策については、以下を参照してください。

+ (NSArray *)sortArrayOfOrdersByDate:(NSMutableArray *)array{
    return [array sortedArrayUsingComparator:^(id obj1, id obj2) {
        return [((Order *)obj2).date compare:((Order *)obj1).date];
    }];
}

解析/解析解除がないため、このソリューションははるかに高速になります。また、二重ループとその上の単一ループを切り取ることができました。

4

2 に答える 2

2

最良の解決策は、ソート可能な形式で SQLITE の日付を表すことです。エポックからの秒数は一般的です。次に、@bengoesboom が提案したように ORDER BY を使用できます。

それができない場合は、これらの 2 つのループをsortedArrayUsingComparator:、コンパレーターが変換を行う場所への単一の呼び出しにまとめることができます。

もちろん、日付を繰り返し解析するため、これは非常に遅くなります。おそらくデータベースから取得したときに変換を行うことにより、オブジェクトの日付を として表す必要がありますNSDates

そしてもちろん、生の SQLite API ではなく、少なくとも FMDB のようなものを使用していることを願っています。また、データ形式の移植性が必要ない場合は、Core Data の使用を検討してください。

于 2013-07-04T17:44:05.717 に答える