You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS模拟器能否用File Manager存储文件?数据读写异常求助

iOS模拟器中File Manager读写文件问题排查

核心结论

iOS模拟器完全支持通过FileManager进行文件的保存与读取操作,你遇到的空数据和错误提示是代码逻辑或初始化问题导致的,并非模拟器本身的限制。

错误提示翻译

你收到的错误信息 "The data couldn’t be read because it is missing." 翻译为:

无法读取数据,因为数据不存在

这个错误说明首次调用downloadFromStorage时,目标文件尚未被创建,因此读取失败并返回空数组。

代码问题分析与修正建议

  1. 属性修改顺序错误
    你当前在将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)
    
  2. 异步操作未同步
    如果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)")
        }
    }
    
  3. 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
        }
    }
    
  4. 验证文件名一致性
    检查self.FILE_NAME常量的拼写,确保读写操作使用完全相同的文件名,避免因文件名不匹配导致找不到文件。

额外排查步骤

可以直接查看模拟器中的文件是否生成:

  1. 打开Xcode,点击Window -> Devices and Simulators
  2. 选中你的模拟器,找到目标App
  3. 点击Download Container,右键下载的文件选择显示包内容
  4. 进入Documents目录,查看是否存在你指定的文件

内容的提问来源于stack exchange,提问作者Chris Hansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:47:04