1

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

这是我的方法:

随应用程序提供的默认类别categoryCollection.plistdefaultCategories.plist将是被操纵的新 .plist 文件

默认字典样式categoryCollection.plist

将类别读入NSMutableSet我使用:

    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

您的方法工作正常,但它所做的工作比每次修改集合时都编写结果所必需的要多。编写文件是您addremove方法中最昂贵的部分。

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

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

于 2012-04-26T14:32:19.833 回答