如何在执行其他操作之前等待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
可能有帮助吗?谢谢!
答案 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
欢呼声,
罗伯特