如何等待plist写操作完成?

时间:2014-01-05 18:34:34

标签: ios iphone objective-c plist

如何在执行其他操作之前等待plist写操作完成?

// Write plist file
NSString *pathToPlist = [NSString pathWithComponents:@[[Util documentsDirectoryPath], @"Settings.plist"]];
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithContentsOfFile:pathToDocumentsPlist];
[dic setObject:@"SomeObject" @"SomeKey"];
[dic writeToFile:pathToDocumentsPlist atomically:YES];

// Read plist file
NSDictionary *updatedDictionary = [NSDictionary dictionaryWithContentsOfFile: pathToPlist];

在这种情况下,我希望updatedDictionary具有更新的plist的值,但是plist write方法(writeToFile)似乎是异步的并且需要一些时间才能完成。因此,updatedDictionary倾向于读取旧的而不是更新的配置,因为在plist读取时,保存操作未完成。

如何解决此问题?只是一个纯粹的推测,可以设置atomically:NO可能有帮助吗?谢谢!

1 个答案:

答案 0 :(得分:0)

第一点这个方法不是异步的,它是同步的,它在操作成功与否时返回一个布尔值,所以你可能没有检查它是否已保存,这可能是你的问题。检查writeToFile的返回:原子地:!

现在,这是一个非常简单的问题,为什么要这样做?

这是你的代码:

// Write plist file
NSString *pathToPlist = [NSString pathWithComponents:@[[Util documentsDirectoryPath], @"Settings.plist"]];
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithContentsOfFile:pathToDocumentsPlist];
[dic setObject:@"SomeObject" @"SomeKey"];
[dic writeToFile:pathToDocumentsPlist atomically:YES];

// Read plist file
NSDictionary *updatedDictionary = [NSDictionary dictionaryWithContentsOfFile: pathToPlist];

首先,您正在将字符读取到字典中 - 好的

其次,您正在更新字典中的数据 - 确定

第三,你再次将字典保存到plist中 - 好的

第四,你再次得到了这个 - 为什么?

你已经在字典中拥有了plist的内容,因为你使用“dic”更新了plist,那么为什么你需要再次阅读相同的内容,如果它具有与plist完全相同的内容? dic和plist在你的代码的那一点是相同的。

如果要确保保存内容,方法writeToFile:atomically返回一个布尔值,您可以在其中查看操作是否成功。顺便说一句,如果这个方法返回一个布尔表示操作已经完成,那么该方法不能是异步的,要异步它应该使用块而不是返回值。

关于你的问题与“原子”,不,它不会使它同步或异步,以最简单的方式描述它,这原子意味着“没有人”可以访问该文件的内容,直到它被完全保存,所以它会保存在一些临时的地方,当它完成后,它会移动到最终目的地,所以如果某个对象在完全保存之前尝试读取/更新/删除它,那就不可能了。

最后尝试这样写你的plist:

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

if([dic writeToFile:[documentsDirectory stringByAppendingString:@"/Settings.plist"] atomically:YES])
//it worked

欢呼声,

罗伯特