Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 具有延迟加载的NSDictionary信息的模型类_Iphone_Objective C_Cocoa - Fatal编程技术网

Iphone 具有延迟加载的NSDictionary信息的模型类

Iphone 具有延迟加载的NSDictionary信息的模型类,iphone,objective-c,cocoa,Iphone,Objective C,Cocoa,我的应用程序使用了大约50多个用作NSDictionary的plists 我的几个视图控制器需要访问字典的属性,因此,每次需要信息时,我都认为使用模型类保存数据并提供信息是合适的,而不是编写重复的代码来检索.plist,将值转换为字典等 这个应用程序不是很大,但它确实可以处理大量数据。我不太擅长编写符合MVC范例的模型类,我正在为这个实现寻找一些也支持延迟加载的策略 此模型类应用于向任何需要数据的视图控制器提供数据,并在控制器请求时对数据执行操作(例如向字典添加条目) 目前计划的职能: 返回任

我的应用程序使用了大约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”否定)是的。我不使用核心数据,所以我倾向于不说任何关于核心数据的事情。