ios - 如何在 iOS(例如 iPhone)中保存 .plist 文件?

标签 ios objective-c iphone

我是 iOS 应用程序开发的新手,我制作了一个具有文本字段、插入按钮和表格的应用程序。

因此,当在文本字段中输入内容时,它会显示在表格中。

当应用程序进入后台或终止时,它会按如下方式保存该列表:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{
    NSBundle *myApp = [NSBundle mainBundle];
    NSMutableString *fileDirectory = [[NSMutableString alloc] initWithString:[myApp bundlePath]];

    [fileDirectory appendString:@"/list.plist"];

    NSLog(@"%@", fileDirectory); //Just for refernece

    [self.viewController.tasks writeToFile:fileDirectory atomically:YES];

    NSLog(@"SAVED");
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSBundle *myApp = [NSBundle mainBundle];
    NSMutableString *fileDirectory = [[NSMutableString alloc] initWithString:[myApp bundlePath]];

    [fileDirectory appendString:@"/list.plist"];

    NSLog(@"%@", fileDirectory); //Just for refernece

    [self.viewController.tasks writeToFile:fileDirectory atomically:YES];

    NSLog(@"SAVED");
}

文件已保存。

关闭应用程序并再次打开应用程序后,我没有取回列表(仅在我的 iPhone 上,在模拟器上它工作正常)

是否可以在 iPhone 上保留列表?

P.S:对不起,如果我说得太冗长了。谢谢。

最佳答案

-writeToFile:atomically: 方法返回一个 BOOL 指示写入操作是否成功。

在您的情况下,它将在模拟器上成功,因为您正在写入您的 Mac 磁盘,这总是可以完成的,因为您的进程对您的应用程序包具有写入权限。在设备上情况并非如此:因为应用程序是代码签名的,所以 bundle 是只读的,您不能向其中写入文件,因此该方法将返回 NO

您应该始终检查此值,并做出适当的响应。还有一种方法采用 NSError 指针,因此您可以了解写入操作失败的原因。

请记住 -writeToFile:atomically: 是一个同步操作,它会阻塞调用它的线程。通常,您希望避免阻塞主线程,因此最好在另一个线程上运行该方法(查看 dispatch_async() 和 GCD 文档)。在你的例子中,你在 applicationWillTerminate: 中调用它,这是你应用程序的最后一口气,你不想分派(dispatch)到另一个线程,因为它会随着 之后的应用程序一起死掉applicationWillTerminate: 返回,很可能在辅助线程有机会完成之前。但是请注意,applicationWillTerminate: 可能不是保存状态的最佳位置,因为那里的时间很短,而且因为此方法仅在您的应用程序真正终止时调用(它不会被调用例如,当您按下主页按钮时)。查看有关其他应用程序生命周期方法的文档,找出最好的保存日期的位置,您可能会发现您甚至不需要使用这些方法,但可以在应用程序运行时“即时”完成保存运行。适合您的目的。

要获取可以写入的目录,您可以使用例如以下代码:

- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

关于ios - 如何在 iOS(例如 iPhone)中保存 .plist 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805920/

相关文章:

android - Windows 上的跨平台开发 (iOS/Android/Blackberry)

c# - Objective C 中的 UIImage 到十六进制转换

objective-c - 将 UITableView 展开到完整尺寸?

iPhone YouTube channel 应用程序

iphone - 无法将iOS项目发送到App Store

iphone - UIScrollView inside UIView, UIView手势单行

ios - 无法读取 Xcode 崩溃日志

ios - ios 开发中基于 XML 的图片库需要帮助

objective-c - 启用 NSDocument 的保存

ios - 如何更改 iphone 应用程序中的语言运行时?