【问题标题】:How can you tell if an Asset URL actually points to an existing asset?如何判断资产 URL 是否实际指向现有资产?
【发布时间】:2012-03-03 18:54:41
【问题描述】:

基本问题:如果您有一个资产 URL 并希望检索该资产的图像,您如何实际验证该资产确实存在?请参阅下面的完整说明以了解详细信息我是说。

我正在开发一个应用程序,它允许用户将图像分组为“包”以进行进一步处理。图像可以来自 iTunes 共享、设备的相机(如果已连接)或设备的照片库。此外,用户可以以一些基本方式编辑图像。 “捆绑”可以长期存在;它们在应用程序停止和启动时被序列化和反序列化,因此应用程序的状态在运行之间保持不变。

我的原始设计将图像保存到应用程序的沙箱中。如果执行了任何编辑,图像就会被简单地重写到其本地文件中。但是,如果捆绑包包含大量图像,则可能会导致不必要的图像内容重复,从而导致“文件系统”使用效果不佳。

我的重新设计现在有了它,如果图像来自资源库,我只存储资源的 URL,并在需要实际显示图像或其内容时检索它。当用户编辑图像时,它会被写入本地沙箱,就像我最初的设计一样。我的应用程序会跟踪图像是来自本地文件系统还是资产库。

我的问题出现在我的应用程序未处于活动状态时。用户完全可以进入照片应用程序并随意删除图像——包括我的应用程序存储了 URL 指针的图像。

我做了一个“如果?”测试看看如果用户做这样的事情会在我的应用程序中发生什么。我看到的事情有点出乎我的意料。我编写了一个遍历捆绑列表的处理程序,使用以下代码验证所有具有资产 URL 的图像:

[assetLibrary
     assetForURL:url
     resultBlock:^(ALAsset *asset) {
         _image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
         // ... everything works!
     }
     failureBlock:^(NSError *error) {
         NSLog(@"Asset verify failed");
         if (_image != nil) {
             // I already have a reference to the UIImage... write it locally
         } else {
             // Image is nil and we have an empty image.
         }
     }];

在我的测试中,我从未遇到过失败块。 Apple 的文档说“如果用户拒绝访问应用程序,或者如果不允许任何应用程序访问数据,则调用失败块。”它没有说明当 URL 不访问时会发生什么存在。事实上,我的测试显示某些东西正在编写一条 NSLog() 消息“找不到 UUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 的资产”(XXX 被原始 URL 中的 UUID 替换)。不过,这还不够糟糕。我仍然可以在屏幕上的视图控制器上看到 UIImageView 中的图像,当我将视图控制器弹出到父级时,我得到了系统重置。

所以,我的问题是,有没有办法判断资产 URL 是否真的存在?我不介意我是否必须取消图像(毕竟,用户是删除图像的人!)。我不喜欢有一些已知的行为路径会始终导致设备重启的想法;我无法向 App Store 提交具有此行为的应用程序。

有什么建议吗?在等待答案的同时,我仍然会自己测试一些想法,但我可以使用人们在这方面给我的任何建议。

谢谢!

【问题讨论】:

  • 对于 iOS5,苹果在 NSURL 类中提供了查询 NSURL 方法。 # checkResourceIsReachableAndReturnError: # – isFileReferenceURL # – isFileURL。我没有使用它,但可能会有所帮助。
  • 一个简单的测试表明:[url checkResourceIsReachableAndReturnError:&error] 总是为资产返回 NO,无论它们是否存在。还有其他想法吗?
  • 顺便说一下,另外两个查询对于资产 URL 也总是返回 NO。

标签: ios


【解决方案1】:

我遇到了类似的问题 - 在 resultBlocked 中,我检查了资产参数是否为 nil - 如果为 nil,则找不到资产。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多