我的应用程序中有NSArray的NSDrray。在每个字典中,我都有一个名为" RunDate的NSDate。"我现在遇到的问题是我尝试使用的代码是非常低效的。基本上我只想在所有词典中每个日期有一个部分。然后在每个部分(按日期排序),我将加载具有该日期的相应字典。
在下面的代码中,我创建了一个NSDictionarys的新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 :(得分:1)
一些建议:
NSMutableDictionary
,而不是NSMutableArray
NSDictionary
。在循环runArray
时,检查您的词典是否包含日期值(objectForKey
返回值)。如果是,请在计数中加1。如果没有,则将该日期作为字典的键添加为值1.这样,您不必进行内部循环以获取日期发生的次数。你不会需要去下一本字典&#39;逻辑要么,我想。runArray = [[NSMutableArray alloc] init];
因为您立即重新分配runArray
而无法做任何事情。NSInteger
而不是常规int
,NSInteger
将为您的应用运行的任何架构提供适当的大小。[runInfoDict setValue:[NSNumber numberWithInt:numbOfDate]...
来避免[runInfoDict setValue:@(numbOfDate) ...
,这会将值放入NSNumber
。