0

アプリが起動するとすぐにこれを行っていますが、幸いなことに、CMIDataManager と呼ばれるシングルトン クラスで 1 回だけ実行する必要があります。アプリの起動に時間がかかりすぎます。

plist には以下が含まれます。

Commanders.plist:

ドイツ語 - 配列

ソビエト - アレイ

各コマンダー配列には 19 のコマンダーがあり、各コマンダーには 5 つのアビリティがあります (固有のアビリティ uid によるマッピング)。

Abilities.plist:

GermanAbilities - 配列

ソビエト能力 - 配列

各配列には、uid を持つ 40 の能力が含まれています (司令官を能力にマッピングするために使用されます)。

最初に、モデル クラスを作成する必要があるため、各アビリティ 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);




}

画像の追加:

コマンダー Plist サンプル アビリティリストのサンプル

4

2 に答える 2

1

明らかなことは、あなたの能力配列は配列ではなく辞書であるべきだということです。そうすれば、uid をすべての能力の uid と比較するのではなく、1 回の操作で調べることができます。

于 2014-03-05T21:28:29.890 に答える
1

問題はこのループにあったようです:

        if ([ability.uid isEqualToNumber: uid]) {

                [commander.abilitiesArray addObject:ability];

}

すべてのアビリティのリストで指揮官のアビリティに一致するものを見つけたら、そのアビリティが残りのアビリティと一致するかどうかを確認する必要がないため、break ステートメントを追加しました。

            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];
于 2014-03-05T21:28:40.910 に答える