Iphone .plist中的可变字符串集合,可选项?

Iphone .plist中的可变字符串集合,可选项?,iphone,objective-c,ios,algorithm,plist,Iphone,Objective C,Ios,Algorithm,Plist,我正在创建一个需要使用类别的应用程序。 我想在应用程序中提供一个基本类别集,但用户可以对其进行编辑(删除、添加类别)。basic.plist不会更改,只会读取一次,然后存储在其他地方 我的做法如下: 应用程序在categoryCollection.plist中交付的默认类别。 defaultCategories.plist将是被操纵的新.plist文件 categoryCollection.plist 要将类别读入NSMutableSeti使用: NSString *mainBundle

我正在创建一个需要使用类别的应用程序。 我想在应用程序中提供一个基本类别集,但用户可以对其进行编辑(删除、添加类别)。basic.plist不会更改,只会读取一次,然后存储在其他地方

我的做法如下:

应用程序在
categoryCollection.plist
中交付的默认类别。
defaultCategories.plist
将是被操纵的新.plist文件

categoryCollection.plist

要将类别读入
NSMutableSet
i使用:

    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操作、测试等的巨大开销,或者是否有更优雅的解决方案来存储字符串集合并让它们被操作

或者,如果您看到任何可能提高速度的speedbump(因为当有很多类别时,我的代码会有一些小的滞后)

有什么想法吗?
sebastian

您的方法工作得很好,但每次修改集合时都要编写结果,这比需要做的工作要多。写入文件是
add
remove
方法中成本最高的部分

解决此问题的一种方法是在应用程序启动时读取类别,将
NSMutableDictionary
缓存在singleton对象中,并在应用程序运行时引用它。当最终用户进行更改时,您只在内存中更新字典;不要立即将数据写入文件


在应用程序委托中,侦听
ApplicationIdentinterBackground:
事件,并将数据写入该处理程序中的文件。另请收听
ApplicationIdentiterForeGround:
事件,并将文件读入
NSMutableDictionary
。这将为您节省大量的CPU周期,并提供更流畅的最终用户体验。

您的方法工作正常,但每次修改集合时都会写入结果,这比需要做的工作要多。写入文件是
add
remove
方法中成本最高的部分

解决此问题的一种方法是在应用程序启动时读取类别,将
NSMutableDictionary
缓存在singleton对象中,并在应用程序运行时引用它。当最终用户进行更改时,您只在内存中更新字典;不要立即将数据写入文件

在应用程序委托中,侦听
ApplicationIdentinterBackground:
事件,并将数据写入该处理程序中的文件。另请收听
ApplicationIdentiterForeGround:
事件,并将文件读入
NSMutableDictionary
。这将为您节省大量CPU周期,并提供更流畅的最终用户体验。

效果很好=)现在可以获得更好的性能。谢谢:)工作正常=)现在性能好多了。谢谢:)