我在应用程序启动时很快就会这样做,幸运的是我只需要在名为CMIDataManager的单例类中执行一次,我的应用程序启动时间太长。
plist包含:
Commanders.plist:
德语 - 数组
苏联 - 数组
每个指挥官阵列有19个指挥官,每个指挥官有5个能力(通过一个独特的能力uid进行映射)。
Abilities.plist:
GermanAbilities - 数组
苏联设施 - 数组
每个数组包含40个具有uid的能力(用于将指挥官映射到能力)
一开始,我需要创建一个模型类,所以我对每个Ability hid迭代指挥官的能力uid,一旦找到匹配,我就将能力模型对象添加到Commaders模型对象。
我怎样才能更快地完成?使用基于块的枚举会加快它吗?我该如何使用它?
-(void)loadCommandersAndAbilities{
#pragma German Abilities iteration
NSString* abilitiesPlistPath = [[NSBundle mainBundle] pathForResource:@"Abilities" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:abilitiesPlistPath];
NSArray *tempArray = [dictionary objectForKey:@"GermanAbilities"];
NSArray *tempArray2 = [dictionary objectForKey:@"SovietAbilities"];
NSMutableArray *tempAbilitiesArray = [[NSMutableArray alloc] initWithCapacity:tempArray.count];
for (NSDictionary *dict in tempArray) {
Ability *ability = [[Ability alloc] init];
[ability populateWithDictionary:dict];
[tempAbilitiesArray addObject:ability];
NSLog(@"Adding object %@ to temp abilities",ability.name);
}
self.germanAbilitiesArray = [NSArray arrayWithArray:tempAbilitiesArray];
[tempAbilitiesArray removeAllObjects];
#pragma Soviet abilities iteration
for (NSDictionary *dict in tempArray2) {
Ability *ability = [[Ability alloc] init];
[ability populateWithDictionary:dict];
[tempAbilitiesArray addObject:ability];
}
self.sovietAbilitiesArray = [NSArray arrayWithArray:tempAbilitiesArray];
#pragma German commander itertation
NSString* commandersPlistPath = [[NSBundle mainBundle] pathForResource:@"Commanders" ofType:@"plist"];
dictionary = [[NSDictionary alloc] initWithContentsOfFile:commandersPlistPath];
tempArray = [dictionary objectForKey:@"German"];
tempArray2 = [dictionary objectForKey:@"Soviet"];
NSLog(@"Temp German commadner array is %@", tempArray);
NSLog(@"Temp Soviet commadner array is %@", tempArray2);
NSMutableArray *tempCommandersArray = [[NSMutableArray alloc] initWithCapacity:tempArray.count];
NSMutableArray *tempCommandersArray2 = [[NSMutableArray alloc] initWithCapacity:tempArray2.count];
for (NSDictionary *dict in tempArray) {
Commander *commander = [[Commander alloc] init];
[commander populateWithDictionary:dict];
for (NSNumber *uid in commander.abilitiesUIDArray) {
NSLog(@"uid %@", uid);
for (Ability *ability in self.germanAbilitiesArray) {
NSLog(@"ability uid is : %@, target uid %@ ",ability.uid, uid);
if ([ability.uid isEqualToNumber: uid]) {
NSLog(@"Adding abilty %@ to commander %@: ",ability.name, commander.name);
[commander.abilitiesArray addObject:ability];
NSLog(@"Current commander abilty array is %@: ",commander.abilitiesArray);
}
}
}
[tempCommandersArray addObject:commander];
}
self.germanCommandersArray = [NSArray arrayWithArray:tempCommandersArray];
NSLog(@"Final german Commaders %@",self.germanCommandersArray);
#pragma Soviet commander itertation
for (NSDictionary *dict in tempArray2) {
Commander *commander = [[Commander alloc] init];
[commander populateWithDictionary:dict];
for (NSNumber *uid in commander.abilitiesUIDArray) {
NSLog(@"uid %@", uid);
for (Ability *ability in self.sovietAbilitiesArray) {
NSLog(@"ability uid is : %@, target uid %@ ",ability.uid, uid);
if ([ability.uid isEqualToNumber: uid]) {
NSLog(@"Adding abilty %@ to commander %@: ",ability.name, commander.name);
[commander.abilitiesArray addObject:ability];
NSLog(@"Current commander abilty array is %@: ",commander.abilitiesArray);
}
}
}
[tempCommandersArray2 addObject:commander];
}
self.sovietCommandersArray = [NSArray arrayWithArray:tempCommandersArray2];
NSLog(@"Final Soviet Commaders %@",self.germanCommandersArray);
}
添加图片:
答案 0 :(得分:1)
显而易见的是,你的异能数组不应该是数组而是字典。这样你就不会将uid与每种能力的uid进行比较,而是在一次操作中查找。
答案 1 :(得分:1)
似乎问题出现在这个循环中:
if ([ability.uid isEqualToNumber: uid]) {
[commander.abilitiesArray addObject:ability];
}
一旦我在所有能力列表中找到了指挥官能力的匹配,我不需要检查该能力是否与其他能力相匹配,所以我添加了一个中断声明。
if ([ability.uid isEqualToNumber: uid]) {
//NSLog(@"Adding abilty %@ to commander %@: ",ability.name, commander.name);
[commander.abilitiesArray addObject:ability];
//NSLog(@"Current commander abilty array is %@: ",commander.abilitiesArray);
break;
}
我还将其添加到代码中,使其在后台线程上运行,将启动时间从6秒降低到0.5秒。
-(instancetype)init {
self = [super init];
if(self) {
[self performSelectorInBackground:@selector(loadCommandersAndAbilities) withObject:nil];
//[self loadCommandersAndAbilities];
// NSOperationQueue
}
return self;
}
loadCommandersAndAbilities:是原始问题中列出的方法,我还添加了通知,让我的视图控制器知道方法何时完成。
// loadCommandersAndAbilities的结尾
[[NSNotificationCenter defaultCenter] postNotificationName:@"TableViewDataDownloaded" object:nil];