iOS应用持久化存储路径获取及图片持久化上传问题求助
iOS 持久化存储图片路径问题修复
你的两段代码存在两个核心问题:
- 第一段代码用了
NSTemporaryDirectory(),这个目录属于临时存储区,系统会在内存不足、应用重启或定期清理时删除其中的文件,完全不适合需要持久化保存的图片。 - 两段代码的文件名生成逻辑都有致命问题:时间戳只在循环外获取一次,一旦生成的路径已经存在,do-while循环会无限执行——因为每次生成的路径完全一样,永远满足
fileExistsAtPath的条件,根本跳不出来。
下面是修复后的代码,解决了上述两个问题:
- (NSString*)persistFilePath:(NSString*)extension { // 使用Documents目录,这是iOS官方推荐的持久化文件存储路径 NSString* docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; NSFileManager* fileMgr = [[NSFileManager alloc] init]; NSString* filePath; // 使用UUID生成绝对唯一的文件名,彻底避免重复 NSString *uniqueName = [[NSUUID UUID] UUIDString]; filePath = [NSString stringWithFormat:@"%@/%@.%@", docsPath, uniqueName, extension]; // 额外做一次检查(理论上UUID不会重复,保险起见) while ([fileMgr fileExistsAtPath:filePath]) { uniqueName = [[NSUUID UUID] UUIDString]; filePath = [NSString stringWithFormat:@"%@/%@.%@", docsPath, uniqueName, extension]; } return filePath; }
补充说明:
- 用
NSUUID生成文件名比时间戳更可靠,时间戳在高并发场景下可能出现重复,UUID则是标准的唯一标识符。 - Documents目录的文件会被iCloud同步(如果用户开启了iCloud备份),如果不需要同步,可以改用
NSApplicationSupportDirectory,或者在Info.plist里配置不备份该目录的文件。
内容的提问来源于stack exchange,提问作者Taku shousei
相关产品推荐
相关产品推荐

