iOS模拟器能否用File Manager存储文件?数据读写异常求助
iOS模拟器中File Manager读写文件问题排查
核心结论
iOS模拟器完全支持通过FileManager进行文件的保存与读取操作,你遇到的空数据和错误提示是代码逻辑或初始化问题导致的,并非模拟器本身的限制。
错误提示翻译
你收到的错误信息 "The data couldn’t be read because it is missing." 翻译为:
无法读取数据,因为数据不存在
这个错误说明首次调用downloadFromStorage时,目标文件尚未被创建,因此读取失败并返回空数组。
代码问题分析与修正建议
属性修改顺序错误
你当前在将book插入数组后才修改其video和mediaUrl属性,这会导致编码到JSON中的对象未包含最新的属性值。应先修改属性再插入数组:// 先修改book属性再插入数组 let video = "sumizeit-video-" + String(book.id) + ".mp4" book.setVideo(video: video) book.setMediaUrl(mediaUrl: "sumizeit-audio-" + String(book.id) + ".mp3") books.insert(book, at: 0)异步操作未同步
如果saveAudio和saveVideo是异步方法,当前代码会跳过等待直接执行JSON编码,可能导致媒体文件未保存完成就写入了数组数据。建议用DispatchGroup等待异步操作完成:let group = DispatchGroup() group.enter() self.saveAudio(book: book) { group.leave() } group.enter() self.saveVideo(book: book) { group.leave() } group.notify(queue: .main) { // 在这里执行JSON编码与保存逻辑 self.items = books MUser.sharedInstance.downloadedItems = self.items let jsonEncoder = JSONEncoder() do { let jsonData = try jsonEncoder.encode(books) if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { let fileURL = dir.appendingPathComponent(self.FILE_NAME) try jsonData.write(to: fileURL, options: .atomic) completion() } } catch { print("编码数组出错:\(error.localizedDescription)") } }Book类需遵循Codable协议
确保Book类正确实现Codable,否则JSON编解码会失败:class Book: Codable { var id: Int var video: String? var mediaUrl: String? // 其他属性 // 若有自定义属性,需声明CodingKeys enum CodingKeys: String, CodingKey { case id, video, mediaUrl } }验证文件名一致性
检查self.FILE_NAME常量的拼写,确保读写操作使用完全相同的文件名,避免因文件名不匹配导致找不到文件。
额外排查步骤
可以直接查看模拟器中的文件是否生成:
- 打开Xcode,点击
Window->Devices and Simulators - 选中你的模拟器,找到目标App
- 点击
Download Container,右键下载的文件选择显示包内容 - 进入
Documents目录,查看是否存在你指定的文件
内容的提问来源于stack exchange,提问作者Chris Hansen
相关产品推荐
相关产品推荐

