Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何等待plist写入操作完成?_Ios_Iphone_Objective C_Plist - Fatal编程技术网

Ios 如何等待plist写入操作完成?

Ios 如何等待plist写入操作完成?,ios,iphone,objective-c,plist,Ios,Iphone,Objective C,Plist,如何在执行其他操作之前等待plist写入操作完成 // Write plist file NSString *pathToPlist = [NSString pathWithComponents:@[[Util documentsDirectoryPath], @"Settings.plist"]]; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithContentsOfFile:pathToDocumentsPlist]

如何在执行其他操作之前等待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写入方法(
writeToFile
)似乎是异步的,需要花费一定的时间才能完成。因此,
updatedDictionary
倾向于读取旧配置,而不是更新的配置,因为在plist读取时,保存操作尚未完成


如何解决这个问题??仅仅是一种推测,将
原子化设置为:NO
可能有帮助吗?谢谢

第一点此方法不是异步的,它是同步的,当操作成功与否时它返回一个布尔值,因此您可能没有检查它是否保存,这可能是您的问题。检查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-好的

第四,你又得到了第一名——为什么

当您使用“dic”更新plist时,您的词典中已经有plist的内容,那么,如果plist的内容与plist完全相同,您为什么需要再次阅读相同的内容呢??dic和plist在代码的这一点上是相同的

如果要确保内容已保存,writeToFile:方法会自动返回一个布尔值,从中可以查看操作是否成功。顺便说一下,如果该方法返回一个布尔值,表示操作已完成,则该方法不能是异步的,要成为异步的,它应该使用block而不是返回值

关于你关于“原子性”的问题,不,它不会使它同步或异步,用最简单的方式描述它,原子性意味着“没有人”可以访问此文件的内容,直到它完全保存,所以它将保存在某个临时位置,当它完成时,它将移动到最终目的地,因此,如果某个对象在完全保存之前尝试读取/更新/删除它,则不可能

最后,试着写下你的plist:

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

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


Roberto

writeToFile:atomically:
是同步的,在方法返回时完成。您发布的代码读取的路径与写入的路径不同。
pathToPlist
pathToDocumentsPlist
似乎指向同一路径,尽管它们是2个
NSString
对象,但这有关系吗?
pathToDocumentsPlist
是较早创建的
NSString
pathToPlist
稍后单独创建。如果
writeToFile:atomically:
是同步的,我将自己尝试找出哪里出了问题。谢谢:)您正在将未知消息“writeToFile”发送到NSMutableDictionary,因为“writeToFile”方法仅在NSData中可用。这是打字错误吗?谢谢,我已经解决了这个问题。为了回答这个问题,我使用另一个
dictionaryWithContentsOfFile
获取内容的原因是,该词典也在其他地方(在另一个线程中)进行了修改。无论如何,谢谢你的回答!