Objective c iOS应用程序启动之间目录未持久化

Objective c iOS应用程序启动之间目录未持久化,objective-c,ios,nsfilemanager,Objective C,Ios,Nsfilemanager,因此,我试图在我正在制作的应用程序的打开之间存储一些数据,但由于某些原因,我正在制作的目录和我正在存储的数据在应用程序打开之间无法持久化,我不明白为什么 我有三种方法: - (NSString *)pathForDataFile { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *documentsDire

因此,我试图在我正在制作的应用程序的打开之间存储一些数据,但由于某些原因,我正在制作的目录和我正在存储的数据在应用程序打开之间无法持久化,我不明白为什么

我有三种方法:

- (NSString *)pathForDataFile 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,     YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"MyApp"];
    NSLog(@"%@", documentsDirectory);

    NSError *error;
    NSLog(@"%i", (int)[[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error]);   

    return documentsDirectory;
}

- (void)saveDataToDisk 
{
    NSString * path = [self pathForDataFile];

    NSMutableDictionary * rootObject;
    rootObject = [NSMutableDictionary dictionary];

    [rootObject setValue: [self usedPlaces] forKey:@"key"];
    [NSKeyedArchiver archiveRootObject: rootObject toFile: path];
}

- (void) loadDataFromDisk
{
    NSString     * path = [self pathForDataFile];
    NSDictionary * rootObject;

    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];    
    [self setObject: [rootObject valueForKey:@"key"]];
}

当我在
pathForDataFile
中打印创建目录的结果时,每次它都会打印1,这意味着每次它创建该目录时,即使它不应该能够打印,因为在一次调用后该目录应该已经存在
saveDataToDisk
applicationWillTerminate
中调用,而
loadDataFromDisk
ApplicationIDBecMeactive
中调用。有人能帮我解释一下为什么会发生这种情况吗?

您需要在代码中执行一些额外的错误检查,以缩小问题实际发生的范围

错误检查,如原始示例代码中的新行:

- (NSString *)pathForDataFile 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"MyApp"];
    BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error];
    // success is NO only if there is an error.  success is YES if directory was created or if the directory already exists
    if(success == NO)
    {
        NSLog( @"error creating directory at path %@ is %@", documentsDirectory, [error localizedDescription] );
    }

    return documentsDirectory;
}

- (void)saveDataToDisk 
{
    NSString * path = [self pathForDataFile];
    if(([self usedPlaces] == NULL) || ([self usedPlaces count] == 0))
    {
        NSLog( @"usedPlaces is either null or has no entries");
    }
    NSDictionary * rootObject = [NSDictionary dictionaryWithObject: [self usedPlaces] forKey: @"key"];
    BOOL success = [NSKeyedArchiver archiveRootObject: rootObject toFile: path];
    if(success == NO)
    {
        NSLog( @"was not able to write data to path %@", path );
    }
}

- (void) loadDataFromDisk
{
    NSString     * path = [self pathForDataFile];
    NSDictionary * rootObject;

    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    if(rootObject)
        [self setObject: [rootObject valueForKey:@"key"]];
    else
        NSLog( @"was not able to load data from file at %@", path );
}

applicationWillTerminate可能没有给您足够的时间。您可以从其他地方调用该方法进行测试吗?@WarifAkhandRishi问题是,它正在打印
NSLog()
s,这意味着该方法正在被及时调用,而不是时间问题……我使用了这些错误检查,这些行就是输出的内容(每个方法输出一个错误,错误的顺序与上述方法相同)
无法从位于/var/mobile/Applications/B2D28246-F274-4789-9976-178EF6F649CC/Library/MyApp的文件加载数据
无法将数据写入路径/var/mobile/Applications/B2D28246-F274-4789-9976-178EF6F649CC/Library/MyApp
无法从位于/var/mobile/Applications/b2d2846-f2789-9976-17的文件加载数据8EF6F649CC/Library/MyApp
编辑:很抱歉格式错误,idk如何修复此问题…因此,您的“
NSKeyedArchiver
”调用“
saveDataToDisk
”失败。我猜“
usedPlaces
中的一个对象属性不是一个可以轻松存档的属性。您需要确保该阵列/字典中的所有内容都可以保存到磁盘(即,并符合NSCoding协议)。