使用延迟加载的NSDictionary信息的模型类

时间:2010-04-06 16:24:42

标签: iphone objective-c cocoa

我的应用程序使用约。 50多个.plists,用作NSDictionaries。

我的几个视图控制器需要访问字典的属性,所以不是编写重复的代码来检索.plist,将值转换为字典等,每次我需要信息时,我认为是一个模型类保存数据和供应信息是合适的。

应用程序不是很大,但它确实处理了大量数据。我不擅长编写符合MVC范例的模型类,而我正在寻找一些支持延迟加载的实现策略..

此模型类应该用于向需要它的任何视图控制器提供数据,并在控制器请求时对数据执行操作(例如向词典添加条目)

目前计划的功能:

  • 返回任何字典的计数
  • 一起添加一个或多个词典

目前,我有这种方法支持任何字典的计数查找。 这会是延迟加载的一个例子吗?

-(NSInteger)countForDictionary: (NSString *)nameOfDictionary {

    NSBundle *bundle  = [NSBundle mainBundle];
    NSString *plistPath = [bundle pathForResource: nameOfDictionary ofType: @"plist"];  

    //load plist into dictionary
    NSMutableDictionary *dictionary  = [[NSMutableDictionary alloc] initWithContentsOfFile: plistPath];
    NSInteger count = [dictionary count]

    [dictionary release];

    [return count]
}

3 个答案:

答案 0 :(得分:1)

(不是答案,但......)您是否考虑过使用Core Data?看起来它比你处理的50(!)字典词组更适合你想要做的事情......

答案 1 :(得分:0)

如果你将数据存储在plist中,我不确定是否可以懒散地加载它,因为plists是XML,据我所知,XML解析器不会懒得工作。

答案 2 :(得分:0)

您可以让对象根据该字典实现其所有属性 - 即,让对象拥有字典,并让其访问者通过发送objectForKey:从该字典中检索值并存储值和setObject:forKey:消息。

然后,有一个检查字典是否加载的方法,如果没有,则加载它:

- (void) loadDictionaryIfNecessary {
    if (myDictionary == nil) {
        <#Load the dictionary.#>
    }
}

然后在每个访问者的开头发送一条loadDictionaryIfNecessary消息。 (明显的缺陷:如果您忘记在访问器中包含此语句,则访问器似乎不起作用。)

这样做的结果是你可以初始化其中一个对象而不立即加载字典。它只是将路径或其他东西复制到另一个实例变量,这样当它第一次尝试访问某个对象的属性时(这是第一次需要字典的任何东西),它可以使用它来加载字典

但是,您不能延迟加载单个属性。您只能一次加载整个字典。

另一种方法是将虚构的数据表旋转90°,并为每个属性提供一个字典,其键是对象的标识符。 (您需要自己想出一个合适的持久标识符方案。)如果您经常同时检索一大堆对象的相同属性而不触及其他属性,则可能会获胜。然而,实现起来要复杂得多,因为访问一个对象的属性会迫使所有兄弟加载。它还会使属性设置更加昂贵,因为您要为每个属性加载,更改和保存属性文件(记住,包含所有对象的属性值) -set。

在您采用后一种解决方案之前,一定要剖析并证明您遇到了性能问题。即使这样,Core Data也可能更容易。