以下のアクティビティをより効率的にする方法はありますか。
+ (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
として保存し、プロパティ間の簡単な比較を可能にする単純な呼び出しを使用しました。NSDate
sortedArrayUsingComparator:
order.date
解決策については、以下を参照してください。
+ (NSArray *)sortArrayOfOrdersByDate:(NSMutableArray *)array{
return [array sortedArrayUsingComparator:^(id obj1, id obj2) {
return [((Order *)obj2).date compare:((Order *)obj1).date];
}];
}
解析/解析解除がないため、このソリューションははるかに高速になります。また、二重ループとその上の単一ループを切り取ることができました。