gpt4 book ai didi

ios - Objective-C 读/写 plist 文件//在尝试了 9999 种不同的解决方案之后

转载 作者:行者123 更新时间:2023-11-29 03:23:05 25 4
gpt4 key购买 nike

就像我在主题中所说的那样,我在读取和写入 .plist 文件时遇到了一些问题。我已经从这里的其他线程和一本书中阅读了很多可能的实现,但我仍然无法使其工作,所以我想征求你的意见。现在是这样的:

我的共享实例数据管理器中有一个电影 arrayMovies 数组。我基于这个数组来处理我的整个应用程序。通过以下方式,它始终可以从应用程序的每个部分“访问”:

[[iCultureDataManager sharedInstance]arrayMovies];

因此,当应用程序完成加载时,我从应该位于 .plist 文件中的数组初始化 arrayMovies,如下所示:

-(NSString* ) getFilePathForMovies{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [path objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"movies.plist"];
return filePath;
}

- (NSArray *) getMovies{
NSString *myPath = [self getFilePathForMovies];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath];
NSArray* movies;
if(fileExists){
movies = [[NSArray alloc ]initWithContentsOfFile:myPath];
}
return movies;
}

在 init 中我只是

_arrayMovies = [NSMutableArray arrayWithArray:[self getMovies]];

我不明白的一件事是为什么 BOOL fileExists 总是返回 false,就像它找不到 .plist 文件一样。

要将数组保存为 .plist 文件,我执行以下操作:

- (void)applicationDidEnterBackground:(UIApplication *)application {
[self addToMovies];
NSLog(@"DidEnterBackground: Adding to Movies...");
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
[self addToMovies];
NSLog(@"applicationWillEnterForeground: Adding to Movies...");
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
/*
Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
*/
}


- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"applicationWillTerminate: Adding to Movies...");
[self addToMovies];
}

- (void) addToMovies{
NSString *myPath = [self getFilePathForMovies];
[[[iCultureDataManager sharedInstance]arrayMovies] writeToFile:myPath atomically:YES];
}

-(NSString* ) getFilePathForMovies{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [path objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"movies.plist"];
return filePath;
}

我认为事情差不多就是这样,但如果我可以帮助您提供更多信息,请随意说,因为我真的不明白发生了什么。我不知道我是否写错了文件或读错了或者我做错了什么。

非常感谢您的时间和帮助,

PS:现在 fileExists 总是返回 -1...:S

最佳答案

你暗示你正在用 plist 文件中的电影列表初始化你的数组。这意味着您从一个 plist 文件开始。要访问包中存在的只读 plist 文件,您可以使用如下不同的路径:

-(NSString *)getOriginalFilePathForMovies {
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"originalMovies" ofType:@"plist"];
contentArray = [NSArray arrayWithContentsOfFile:plistPath];
}

然后要访问可写的 plist,你需要一个像你正在使用的路径:

-(NSString* ) getFilePathForMovies{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [path objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"movies.plist"];
return filePath;
}

所以我建议这样做来初始化你的数组:

- (NSArray *)getMovies {
NSString *myPath = [self getFilePathForMovies];
BOOL fileExists = [[NSFileManager defaultManager]fileExistsAtPath:myPath];
NSArray* movies;
if(fileExists){
movies = [[NSArray alloc]initWithContentsOfFile:myPath];
} else {
movies = [[NSArray alloc]initiWithContentsOfFile:[self getOriginalFilePathForMovies]];
return movies;
}

关于ios - Objective-C 读/写 plist 文件//在尝试了 9999 种不同的解决方案之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20832974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com