Iphone 具有延迟加载的NSDictionary信息的模型类
我的应用程序使用了大约50多个用作NSDictionary的plists 我的几个视图控制器需要访问字典的属性,因此,每次需要信息时,我都认为使用模型类保存数据并提供信息是合适的,而不是编写重复的代码来检索.plist,将值转换为字典等 这个应用程序不是很大,但它确实可以处理大量数据。我不太擅长编写符合MVC范例的模型类,我正在为这个实现寻找一些也支持延迟加载的策略 此模型类应用于向任何需要数据的视图控制器提供数据,并在控制器请求时对数据执行操作(例如向字典添加条目) 目前计划的职能:Iphone 具有延迟加载的NSDictionary信息的模型类,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,我的应用程序使用了大约50多个用作NSDictionary的plists 我的几个视图控制器需要访问字典的属性,因此,每次需要信息时,我都认为使用模型类保存数据并提供信息是合适的,而不是编写重复的代码来检索.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]
}
(不是答案,但…)您是否考虑过使用核心数据?它似乎比处理50个(!)plist的字典更适合您要做的事情…如果您将数据存储在plist中,我不确定是否可以延迟加载它,因为plists是XML,据我所知,XML解析器不会懒散地工作。您可以让对象根据该字典实现其所有属性,也就是说,让对象拥有一个字典,并让其访问器通过发送
objectForKey:
和setObject:forKey:
消息从该字典中检索值并将值存储在该字典中
然后,使用一种方法检查字典是否已加载,如果未加载则加载:
- (void) loadDictionaryIfNecessary {
if (myDictionary == nil) {
<#Load the dictionary.#>
}
}
-(无效)加载字典是必需的{
如果(myDictionary==nil){
}
}
然后在每个访问者的开头向自己发送一条必要的loadDictionaryIfNecessary
消息。(明显的陷阱:如果忘记将此语句包含在访问器中,则访问器似乎无法工作。)
这样做的结果是,您可以在不立即加载字典的情况下初始化其中一个对象。它只需将路径或某个对象复制到另一个实例变量,以便在某个对象首次尝试访问某个对象的属性时(这是该对象第一次需要使用字典进行任何操作)可以使用该路径或对象加载字典
但是,您不能延迟加载单个属性。一次只能加载整本词典
另一种方法是将虚构的数据表旋转90°,并为每个属性设置一个字典,其键是对象的标识符。(您需要自己想出一个合适的持久标识符方案。)如果您经常一次检索一整组对象的同一属性,而不涉及其他属性,这可能是一个胜利。不过,实现起来要复杂得多,因为访问一个对象的属性会强制其所有兄弟加载。这还将使设置属性的成本更高,因为您将为每个属性集加载、更改和保存属性文件(记住,该文件包含属性的所有对象值)
在采用后一种解决方案之前,请明确地描述并证明您存在性能问题。即使这样,核心数据也可能更容易。我根本没有想过这一点。谢谢你的提示。我会看看我能找到什么关于核心数据谢谢你的建议。就核心数据而言,您的第一个解决方案仍然只是使用带有核心数据的自定义模型类,对吗?(对于核心数据实现的外观仍然一无所知)我只是在努力使用一个类来处理我的数据,而不是将这些操作硬塞进视图控制器(避免MVC“范型ic”否定)是的。我不使用核心数据,所以我倾向于不说任何关于核心数据的事情。