1

カテゴリを操作する必要があるアプリケーションを作成しています。アプリで配信したい基本的なカテゴリ セットがありますが、ユーザーが編集できます (カテゴリの削除、追加)。基本的な .plist は変更されませんが、一度だけ読み取られ、別の場所に変更可能に保存されます。

ここに私のアプローチがあります:

categoryCollection.plistアプリ で提供されるデフォルトのカテゴリ。defaultCategories.plist操作される新しい .plist ファイルになります

デフォルト辞書スタイルcategoryCollection.plist

カテゴリをNSMutableSeti に読み込むには:

    NSString *mainBundlePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dictPath = [mainBundlePath stringByAppendingPathComponent:@"defaultCategories"];
    NSDictionary * dict = [[NSDictionary alloc]initWithContentsOfFile:dictPath];

    // testing if the file has values, if not load from categoryCollection.plist
    if (dict.count == 0) {
        NSString *tempPath = [[NSBundle mainBundle] pathForResource:@"categoryCollection" ofType:@"plist"];
        dict = [NSMutableDictionary dictionaryWithContentsOfFile:tempPath];
        [dict writeToFile:dictPath atomically:YES];
    }

    // load into NSMutableSet
    [self.stringsCollection addObjectsFromArray:[[dict objectForKey:@"categories"]objectForKey:@"default"]];

カテゴリを追加するには、この関数を呼び出します:

-(void)addCategoryWithName:(NSString *)name{

    NSString *mainBundlePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dictPath = [mainBundlePath stringByAppendingPathComponent:@"defaultCategories"];
    NSMutableDictionary * dict = [[NSMutableDictionary alloc]initWithContentsOfFile:dictPath];
    [[[dict objectForKey:@"categories"]objectForKey:@"default"]addObject:name];

    [dict writeToFile:dictPath atomically:YES];

    self.needsToUpdateCategoryCollection = YES;
}

そして、私が使用する文字列を削除するには:

-(void)removeCategoryWithName:(NSString *)name{

    NSString *mainBundlePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dictPath = [mainBundlePath stringByAppendingPathComponent:@"defaultCategories"];
    NSDictionary * dict = [[NSDictionary alloc]initWithContentsOfFile:dictPath];

    NSMutableArray *temp = [NSMutableArray arrayWithArray:[[dict objectForKey:@"categories"]objectForKey:@"default"]] ;

    for (NSString *string in temp) {
        if ([string isEqualToString:name]) {
            [temp removeObject:string];
            break;
        }
    }
    [[dict objectForKey:@"categories"]removeObjectForKey:@"default"];
    [[dict objectForKey:@"categories"] setValue:temp forKey:@"default"];


    [dict writeToFile:dictPath atomically:YES];
    self.needsToUpdateCategoryCollection = YES;
}

コードは実際には非常にうまく機能しますが、複数の I/O 操作、テストなどのこの膨大なオーバーヘッドが本当に必要なのか、それとも文字列のコレクションを格納して操作できるようにするためのより洗練されたソリューションがあるのだろうか?

または、速度を向上させる可能性のあるスピードバンプが表示された場合(多くのカテゴリがある場合、そのコードで小さなラグが発生するため)

何かご意見は?セバスチャン

4

1 に答える 1

1

あなたのアプローチはうまく機能しますが、コレクションが変更されるたびに結果を書き込むことで、必要以上の作業を行います。addandremoveメソッドで最もコストのかかる部分はファイルの書き込みです。

この問題に対処する 1 つの方法は、アプリの起動時にカテゴリを読み取りNSMutableDictionaryシングルトンオブジェクトにキャッシュして、アプリの実行時にそれを参照することです。エンド ユーザーが変更を行うときは、メモリ内でのみディクショナリを更新します。データをすぐにファイルに書き込まないでください。

アプリ デリゲートで、イベントをリッスンし、applicationDidEnterBackground:そのハンドラーでファイルにデータを書き込みます。applicationDidEnterForeground:また、イベントをリッスンし、ファイルを に読み込みますNSMutableDictionary。これにより、多くの CPU サイクルが節約され、よりスムーズなエンド ユーザー エクスペリエンスが提供されます。

于 2012-04-26T14:32:19.833 に答える