2016-02-27 151 views
0

所以,我有两种方法:编码效率VS执行效率

-(void)importEvents:(NSArray*)allEvents { 
    NSMutableDictionary *subjectAssociation = [[NSMutableDictionary alloc] init]; 

    for (id thisEvent in allEvents) { 
     if (classHour.SubjectShort && classHour.Subject) { 
      [subjectAssociation setObject: classHour.Subject forKey:classHour.SubjectShort]; 
     } 
    } 

    [self storeSubjects:subjectAssociation]; 
} 

-(void)storeSubjects:(NSMutableDictionary*)subjects { 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *subjectsList = [documentsDir stringByAppendingPathComponent:@"Subjects.plist"]; 

    [subjects writeToFile:subjectsList atomically:YES]; 
} 

第一循环通过假设100个项目组成的数组,并建立约10个独特的键/值对的NSMutableDictionary。

第二种方法将此字典写入文件以供在我的应用程序中的其他地方参考。

第一种方法经常被调用,第二种方法也是如此。但是,我知道,一旦字典被构建和保存,无论我多么频繁地调用这些方法,它的内容都不会改变,因为可能值的数量是有限的。

问题:考虑到第二个方法本质上只需要执行一次的事实,我应该添加一些行来检查文件是否已经存在,基本上添加了需要执行的代码,或者我可以将它保留为是,一遍又一遍覆盖一个现有的文件?

我应该在意吗?我应该补充说,我似乎没有任何性能问题,所以这更多的是一个哲学/卫生问题。

谢谢

+1

您提到“供我的应用程序中的其他地方参考”。所以你写入磁盘的唯一原因是从同一个应用程序中的其他地方再次打开它?那么为什么不把它存储在一个变量中以便以后访问数据呢? – Joost

+0

因为应用程序可能被强制退出,并且我需要依赖这样一个事实,即在重新启动时执行任何代码之前,此信息可用 – Sjakelien

回答

1

这取决于。

你说

一旦字典是建立和保存,它的内容永远不会改变

,直到他们做:-)

如果您的应用不患在这个特定的循环中,我不会尝试缓存任何性能问题,因为除非您记住您在文件上只有一次写入,否则您将在稍后存储一个错误。

这可以通过在方法上使用意图揭示名称来缓解。即

-(void)storeSubjectsOnceOnlyPerLaunch:(NSDictionary*)subjects 

如果我有时间追溯缓存引起的错误,我会有好几天回到我的生活中。

0

您的解决方案完全过度设计,并且存在大量潜在的问题。如果用户驱动器已满,该怎么办?这个文件是否被备份?它是否需要备份/是否在浪费用户时间进行备份?这可能会失败吗?你正在处理它吗?您专注于输入和存储数据,您应该专注于访问该数据。

我会有一个readwrite属性allEvents和一个属性eventAssociations,在接口中声明为readonly,但是在实现文件中是readwrite。

allEvents setter存储allEvents并将_eventAssociations设置为nil。 eventAssociations getter会检查_eventAssociations是否为零,并在需要时重新计算它。一个简单和防弹模式。