如何判断资产URL是否实际指向现有资产?

时间:2012-03-03 18:54:42

标签: ios

基本问题:如果您有资产网址并希望检索该资产的图片,您如何实际验证该资产是否确实存在?请参阅下面的完整说明,详细了解我的意思是。

我正在开发一个应用程序,允许用户将图像分组为“捆绑包”以进行进一步处理。图像可以来自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替换)。但这还不够糟糕。我仍然可以在屏幕上的View Controller上看到UIImageView中的图像,当我将视图控制器弹出到父控件时,我得到系统重置。

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

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

谢谢!

1 个答案:

答案 0 :(得分:5)

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