2016-06-16 2 views
0

私のアプリケーションにNSDictionariesのNSArrayがあります。各辞書には、 "RunDate"と呼ばれるNSDateがあります。私が今問題を抱えているのは、それをやろうとしているコードが非常に非効率的だということです。基本的には、すべての辞書のうち、日付ごとに1つのセクションのみが必要です。その後、各セクション(その日付でソート)で、その日付の適切な辞書をロードします。NSDictionaryからNSDateでUITableViewセクションをロードしますか?

以下のコードでは、NSDictionaryの新しいNSArrayを作成しました。このNSArrayには、その日付の日付と番号が格納されています(各セクションにいくつの行があるかわかります)。問題は、このコードは非常に効率が悪く、非常に非効率的であると感じています。私のコードが間違っているか、改善できるかどうかは疑問でした。 500以上のエントリがあり、私が今使っているコードは非常に遅いでしょう。誰にもそれに関する提案はありますか?

runArray = [[NSMutableArray alloc] init]; 
    runArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"RunArray"] mutableCopy]; 

    runDictTableArray = [[NSMutableArray alloc] init]; 
    for (NSDictionary *dict in runArray) { 
     NSDictionary *runInfoDict = [[NSMutableDictionary alloc] init]; 
     NSDate *theDate = [dict objectForKey:@"RunDate"]; 

     //Check if we already have this date in the saved run array 
     BOOL goToNextDict = FALSE; 
     for (NSDictionary *savedDict in runDictTableArray) { 
      if ([theDate compare:[savedDict objectForKey:@"RunDate"]] == NSOrderedSame) { 
       goToNextDict = TRUE; 
       break; 
      } 
     } 
     if (goToNextDict) 
      continue; 
     //////////////////////////// 

     //Now we check how many more we have of this date 
     int numbOfDate = 1; 
     int index = (int)[runArray indexOfObject:dict]; 
     for (int i = index; i < [runArray count]; i++) { 
      NSDictionary *dictInner = [runArray objectAtIndex:i]; 
      if ([theDate compare:[dictInner objectForKey:@"RunDate"]] == NSOrderedSame) { 
       numbOfDate++; 
      } 
     } 
     //////////////////////////// 

     [runInfoDict setValue:[NSNumber numberWithInt:numbOfDate] forKey:@"DateAmount"]; 
     [runInfoDict setValue:theDate forKey:@"Date"]; 
     [runDictTableArray addObject:runInfoDict]; 
    } 
+0

NSSortDescriptorを試しましたか?それはおそらくもっと簡単だろう... – Echizzle

答えて

1

ヒント:

  1. あなたはおそらく唯一の1 NSMutableDictionaryはなく、NSDictionaryNSMutableArrayを必要としています。 runArrayをループしている間、あなたの辞書にあなたの日付の値があるかどうかを確認してください(objectForKeyが値を返します)。存在する場合は、カウントに1を加算します。そうでない場合は、その日付を値1のキーとして辞書に追加します。このようにして、内部ループを実行して日付が発生する回数を取得する必要はありません。あなたは「次の辞書に行く」ロジックも必要ないでしょう、と私は思います。
  2. runArray = [[NSMutableArray alloc] init];はすぐにrunArrayを割り当て直すので、実際に何もしません。
  3. 通常のintよりNSIntegerを使用することを検討してください。NSIntegerは、アプリが実行されているアーキテクチャに応じた適切なサイズを提供します。
  4. クールな構文ショートカットがあります。 [runInfoDict setValue:[NSNumber numberWithInt:numbOfDate]...を避けるには、[runInfoDict setValue:@(numbOfDate) ...と書くだけで、値はNSNumberになります。
関連する問題