将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的
Posted
技术标签:
【中文标题】将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的【英文标题】:Save strings from different viewController to plist without overwriting old ones 【发布时间】:2014-08-08 22:44:45 【问题描述】:我想将一些来自不同 ViewController 的字符串保存到一个 plist。 目前,我的 VC1 的 viewDidLoad 将字符串保存到 plist,当我调用 VC2 时,我的 plist 已被 VC2 中的字符串覆盖。
我在 VC1 和 VC2 中的 viewDidLoad 是相等的,像这样:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
NSArray *array = [NSArray arrayWithObjects:dateString , nil ];
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFolder = [path objectAtIndex:0];
NSString *filePath = [documentFolder stringByAppendingFormat:@"list.plist"];
//save to array
[array writeToFile:filePath atomically:YES];
NSLog(@"file Stored at %@",filePath);
问题:
我该如何处理这个问题,我的 plist 中的指针会转到第二个位置,这样我就不会覆盖我的旧数据?
我只想保存来自三个不同 ViewController 的字符串(日期和一些文本),这是一个很好的方法,还是我应该使用核心数据?
【问题讨论】:
保存一个 plist 是全部或全部。您需要将要保留的值加载到数组中,将新值添加到数组中。然后编写数组以使用您想要的值创建一个新的 plist。 @rmaddy:谢谢。我知道问题出在静态数组上,但我想也许有一些特别的东西可以处理这个问题。 【参考方案1】:我建议你使用核心数据,它真的很简单,可以避免你编写代码来管理保存、日期和奇怪的逻辑。它还为您提供有用的功能,例如:
托管对象更改或保存以允许您更新 UI 时的通知 内置类 (NSFetchedResultController) 可帮助您在 tableViews 上高效显示数据为避免与核心数据相关的样板代码,请尝试查看magicalrecord
【讨论】:
【参考方案2】:解决第一个问题的两种方法:
与其创建每次都覆盖的数组的本地版本,不如使用静态和全局且对两个控制器可见的 NSArray,这样每个控制器都附加到同一个对象,因此他们不会踩到对方的脚趾头。
而不是写入文件 .. 附加到文件。
NSString *contents = [NSString stringWithContentsOfFile:filepath];
contents = [contents stringByAppendingString:textToWrite];
[contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err];
回答您的第二个问题.. 我想说这取决于数据交互的种类和数量.. 如果数据很小并且交互又远又少,那么文件存储就可以了。
如果数据量很大并且交互开始变得更加复杂和复杂.. 有多个类读写,CoreData 绝对是一个值得关注的选项。
我的 2 美分价值
【讨论】:
以上是关于将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的的主要内容,如果未能解决你的问题,请参考以下文章