尽管缓存目录中存在文件,但 UIImage(contentsOfFile:) 返回 nil [重复]

2023-12-29

我正在尝试将带有叠加层的地图快照保存在缓存目录中,并在存在时检索它。然而,尽管创建了文件,但当我尝试检索它时, UIImage(contentsOfFile:) 返回 nil 。我已经打印了写入和读取的文件路径,它们是相同的,并且通过下载容器并检查目录和文件确实存在来验证文件是否存在。

知道这里的问题是什么吗?

let cachesDirectory: URL = {
    let urls = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
    return urls[urls.endIndex - 1]
}()

let mapCachesDirectory = cachesDirectory.appendingPathComponent("map-snapshots", isDirectory: true)

func configureMap(data: NSSet?) {
    mapView.isZoomEnabled = false
    mapView.isScrollEnabled = false
    mapView.isUserInteractionEnabled = false

    guard let data = data as? Set<SessionData>, data.count > 0 else { return }

    activityIndicatorView.isHidden = false
    activityIndicatorView.startAnimating()

    DispatchQueue.global(qos: .userInitiated).async {
        var points = [CLLocationCoordinate2D]()
        for object in data {
            guard object.locationLatitude != 0, object.locationLatitude != 0 else { continue }
            points.append(CLLocationCoordinate2DMake(object.locationLatitude, object.locationLongitude))
        }
        DispatchQueue.main.async(execute: {
            self.createOverlay(points: points)
            self.activityIndicatorView.stopAnimating()
            self.activityIndicatorView.isHidden = true
            self.cacheMapImage(view: self.mapView)
        })
    }
}

func cacheMapImage(view: UIView) {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0)
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
    let compositeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    DispatchQueue.global(qos: .userInitiated).async {
        if let compositeImage = compositeImage, let info = self.info {
            let data = UIImagePNGRepresentation(compositeImage)
            do {
                var isDirectory: ObjCBool = false
                let fileManager = FileManager.default
                if fileManager.fileExists(atPath: self.mapCachesDirectory.absoluteString, isDirectory: &isDirectory) == false {
                    try fileManager.createDirectory(at: self.mapCachesDirectory, withIntermediateDirectories: true, attributes: nil)
                }
                let fileURL = self.mapCachesDirectory.appendingPathComponent(info.uid).appendingPathExtension("png")
                try data?.write(to: fileURL)
                print("\(fileURL.absoluteString) Saved")
            } catch {
                log.error(error)
            }
        }
    }
}

func cachedMapImage() -> UIImage? {
    guard let info = info else { return nil }
    let filePath = mapCachesDirectory.appendingPathComponent(info.uid).appendingPathExtension("png").absoluteString
    let image = UIImage(contentsOfFile: filePath)
    print("\(filePath): \(image)")
    return image
}

func createOverlay(points: [CLLocationCoordinate2D]) {
    guard points.count > 0 else { return }

    let overlay = MKGeodesicPolyline(coordinates: points, count: points.count)
    mapView.add(overlay)

    let inset: CGFloat = 50.0
    mapView.setVisibleMapRect(overlay.boundingMapRect, edgePadding: UIEdgeInsetsMake(inset,inset,inset,inset), animated: true)
}

问题在于您正在使用 URL 属性absoluteString,而您应该使用路径属性。和...之间的不同absoluteString and path属性的问题是absoluteString包含文件url方案(“file://”),这就是它在应该是其路径的地方找不到文件的原因,但它实际上是它的absoluteString。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管缓存目录中存在文件,但 UIImage(contentsOfFile:) 返回 nil [重复] 的相关文章

  • 在 Swift 中有条件导入基于 iOS 版本的框架(如 Speech)?

    有没有办法有条件地导入框架Swift基于运行时 iOS 版本 特别是 我有一个部署目标为的应用程序iOS 8 我想使用新的Apple Speech应用程序中的框架 如果在运行时可用 我知道 available iOS 10 代码部分的指令
  • iOS 9.3 中的 KVO 被破坏

    这可能是 iOS 9 3 发行版 中的一个可怕的错误 添加单个观察者时 NSUserDefaults standardUserDefaults 我注意到响应方法 observeValueForKeyPath ofObject change
  • 使用 Swift 访问 Twitter

    我正在使用 Swifter 库在我的 Swift iOS 8 应用程序中访问 Twitter https github com mattdonnelly Swifter https github com mattdonnelly Swift
  • 如何在 Alamofire 中使用“responseDecodable”方法?

    I have been trying to use responseDecodable method from Alamofire but I m getting Generic parameter T could not be infer
  • iOS8 自签名证书已安装但仍不受信任

    由于我无法控制的原因 我需要使用自签名证书针对平台进行 iOS 开发 它是一个在 SAN 中具有特定 IP 地址的根证书 当证书安装在 OSX 系统帐户下时 所有浏览器现在将正常信任对给定 IP 地址的任何访问 通过电子邮件将同一证书发送到
  • 如何在 iOS 中创建多行表格单元格?

    如何让第二个单元格扩展以适合文本而不是缩放文本 iOS 中有内置的方法可以做到这一点 还是我必须想出一些自制的解决方案 如果您查看 iOS 联系人应用程序 会发现有一个类似地址的框 但我找不到如何实现这一点 对于任何希望将来实现这一目标的人
  • 每次打开应用程序时,FileManager 的路径 URL 都不同[重复]

    这个问题在这里已经有答案了 我想在fileManager根路径中创建一个文件夹 但在创建之前 我想检查该文件夹是否存在 如果不存在 我将创建 否则将保留它 这是我使用的功能 public func isDirectoryExist path
  • UICollectionViewFlowLayout 使其布局无效后重绘单元格

    当您使布局无效时UICollectionViewFlowLayout它为每个单元格创建了一堆新的布局属性 然而 它不会告诉您的单元格重新绘制 这会导致任何图层绘图变形 我不想告诉我的集合重新加载其数据 因为这会删除流属性之间的任何良好转换
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • ios GPUImage,小尺寸图像处理效果不好?

    我正在尝试为 OCR 准备图像 我使用 GPUImage 来完成 代码工作正常 直到我裁剪图像 裁剪后我得到了糟糕的结果 作物面积 https www dropbox com s e3mlp25sl6m55yk IMG 0709 PNG h
  • 如何将 RGB 值转换为十六进制字符串 iOS swift

    我想将 RGB 值转换为十六进制字符串 我将十六进制转换为 RGB 如下所示 但反之亦然 func hexStringToRGB hexString String gt red CGFloat green CGFloat blue CGFl
  • 我的 iPhone 6 获取 iPhone 5 媒体查询

    我不明白这里发生了什么事 我在 CSS 媒体查询中专门针对 iphone 5 media only screen and min device width 320px and max device width 568px some div
  • AST 文件格式错误或损坏

    我有一个问题 我不知道为什么会发生这种情况 但很可能是因为我错误地按了 移动到垃圾箱 到某些系统框架 我收到一条错误消息 AST 文件格式错误或损坏 找不到 AST 文件引用的文件 Users username myProject Quar
  • watchOS 2 上的最大内存使用量?

    我没有找到任何有关 watchOS 2 中应用程序可用内存使用的信息 我目前正在为 watchOS 开发一个应用程序 并且在手表端使用 Core Data 当我将 189 个对象中的 166 个加载到数组时 应用程序崩溃 此时的内存使用量为
  • 在 Swift 中计算两个 CLLocation 点之间的方位角 [重复]

    这个问题在这里已经有答案了 我正在尝试计算仅 swift 代码中两个 CLLocation 点之间的方位 我遇到了一些困难 并假设这是一个非常简单的函数 堆栈溢出似乎没有列出任何内容 func d2r degrees Double gt D
  • UnsafeMutablePointer 到具体对象类型

    我怎样才能从UnsafeMutablePointer
  • 辅助功能标识符在 iOS 模拟器的辅助功能检查器中不可见

    我想使用辅助功能检查器来验证在模拟器 iOS 9 2 中运行的应用程序中的所有辅助功能标识符 辅助功能检查器能够返回多个辅助功能字段 但不能返回标识符 知道为什么以及如何我能看到它们吗 实际上有一种方法 克里斯 普林斯 Chris Prin
  • 如何动态添加XCTestCase

    我正在为一个白标签项目编写 UI 测试 其中每个应用程序都有一组不同的菜单项 测试点击每个菜单项并截取屏幕截图 使用快车道快照 https docs fastlane tools actions snapshot 目前这一切都发生在一个内部
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知
  • 为什么我收到 com.facebook.sdk.login 错误 308?

    我正在使用 Xcode 7 0 在 iOS 9 0 2 上进行测试并使用 Facebook SDK 4 7 0 当我登录用户时 大多数时候一切都正常 但有时我不断收到此错误 但我不知道为什么 操作无法完成 com facebook sdk

随机推荐

  • Mat扩展面板默认打开的bug?

    自从 Angular 5 发布以来 我的垫子扩展面板出现了一些问题 它们是默认打开的 我不明白为什么 my html div div
  • 有没有一个脚本可以列出我创建的 git 分支?

    我知道分支并不真正存储创建者信息 它们只是指向提交的指针 我的目标是能够清理已合并回主分支的旧分支 并列出尚未完成此操作的分支 清理 这与 查找未合并的分支 不同 因为我也想查找合并的分支 并且我想由作者来完成 我的问题是 有没有一个脚本可
  • phpmyadmin - 错误 2002 - 在 Mac 上

    我目前使用的是Mac 运行的操作系统版本是El Capitan 网络根目录是 Users username Sites 我下载并解压了 phpmyadmin 并将目录移动到根文件夹 然后我成功进入了登录屏幕 但是当我尝试登录时 它显示这样的
  • 在运行时加载类时无法创建 bean

    我有两个工作方式不同的项目 第一个用于类加载 第二个有其类用于执行一些处理工作 在第一个项目中 我加载该类 而不是创建新实例来调用该方法 我仅使用应用程序上下文 Autowired ApplicationContext context Cl
  • DSN 连接和带有 @ 的密码

    我考虑切换到使用 DSN 连接的数据库访问库 connect mysql login password database options DSN 使用 作为分隔符 这是否意味着密码不能包含 符号 还有其他限制吗 任何特殊字符对于 DSN 来
  • UIToolbar 的颜色没有改变

    我创建了一个 UIToolbar 我正在尝试使用以下方法将其变为黑色 toolbar barStyle UIBarStyleBlackOpaque or 工具栏background财产 但在任何一种情况下其颜色都不会改变 我怎样才能改变它
  • 在 OOP 中,什么是转发?它与委托有何不同?

    有人可以解释一下转发和委托之间的区别吗 它们看起来很相似 但我一直无法找到转发的良好定义 所以我不确定我是否真的理解 我们首先定义两个术语 sender the object that sends a message task to ano
  • 如何在execlp()之后找到程序的返回值? [复制]

    这个问题在这里已经有答案了 我在c中有以下代码 execlp ReturnValue c ReturnValue c应该返回0 3之间的整数 并且由于程序成功运行时execlp不会返回任何内容 那么如何获取该程序的返回值 你可以这样做 pi
  • 构建目录中的所有项目

    我尝试构建位于根目录的单独目录中的插件
  • 更改 blogdown 帖子的默认目录

    我正在使用的 Hugo 主题的帖子位于 content blog目录 而默认创建的新帖子blogdown new post is the content post目录 从函数定义来看 有一个全局选项可以更改新帖子保存到的目录 帮助也指出了这
  • IE 7、IE 8 等多选项卡浏览器会话问题

    由于会话对象 我对所有多选项卡浏览器都存在问题 我有一个要求 每当用户打开一个新浏览器时 我需要显示不同的值 所以我想到使用 Session 就像 IE 6 中每个浏览器都会创建一个新会话一样 但所有其他多选项卡浏览器 IE 7 和 IE
  • 如何从Thread获取返回值?

    我在用Thread for Webservice但我无法从中获取数据Thread因为我无法返回数据Thread 这是我的WebService java public class Webservice static String result
  • Java(桌面)应用程序的“自动更新”?

    您推荐什么系统来为某些 java 桌面 应用程序实现 自动更新 我还想安装和更新模块 插件 想想 Eclipse 和 Firefox 我知道 Eclipse RCP 的 OSGi 内容 NetBeans RCP 也有一些内容 是否必须完全购
  • 如何使用 IE7 Javascript 内存泄漏检测器?

    我下载了 SO 上其他地方提到的 IE 的 Javascript Memory Leak Detector 也在这里 http blogs msdn com askie archive 2008 12 31 javascript memor
  • Dynatree 展开所选节点的父级

    我的页面上运行良好的 Dynatree 我正在使用 initAjax 来获取结构 当我生成 json 时 我包含 选择 真在适当的地方选择复选框 大多数 所有 复选框都位于从根向下三层的深度 我想展开所选节点的父级 以便用户在页面加载时可以
  • 在网页中嵌入 Powerpoint

    有没有办法仅使用标准标签等将 PowerPoint 幻灯片嵌入到 HTML 页面中 我尝试使用 iframe 但这只会导致 PowerPoint 被下载 Your browser does not support 我正在寻找一种仅使用标准内
  • Rails simple_nested_form_for fields_for 参数数量错误

    所以我正在 Rails 3 1 中构建一个表单 使用 但部分中的这一行导致了问题 h2 Badges h2 ul this following line is raising the error wrong number of argume
  • Heroku 上的 Ruby 守护进程

    我正在尝试执行 ruby 守护进程无框架Heroku 上的应用程序 但在尝试执行工作程序后崩溃 heroku worker 1 State changed from crashed to starting heroku worker 1 S
  • Java-允许一个线程更新值,其他线程等待并跳过关键部分

    您好 我遇到一种情况 我必须只允许一个线程更新变量 有一个触发器 它可能会调用多个线程来更新此变量 但是更新应该仅由到达关键部分的第一个线程发生一次 理想情况下 流程应如下所示 线程1 调用 Thread 2 和 Thread 3 来更新由
  • 尽管缓存目录中存在文件,但 UIImage(contentsOfFile:) 返回 nil [重复]

    这个问题在这里已经有答案了 我正在尝试将带有叠加层的地图快照保存在缓存目录中 并在存在时检索它 然而 尽管创建了文件 但当我尝试检索它时 UIImage contentsOfFile 返回 nil 我已经打印了写入和读取的文件路径 它们是相