2012-03-03 33 views
5

基本问题:如果您有一个资产URL并希望检索该资产的图像,您如何确实验证该资产实际存在?请查看我的完整说明,了解我的意思。如何判断资产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替换)。尽管如此,这还不够糟糕。我仍然可以在屏幕上的View Controller上看到UIImageView中的图像,并且当我将视图控制器弹出到父级时,系统会重置。

所以,我的问题是,有什么办法可以告诉资产网址是否真的存在?我不介意是否必须清空图像(毕竟,用户是删除图像的用户!)。我不喜欢有一些已知的行为路径会持续导致设备重新启动的想法;我无法将具有此行为的应用程序提交给App Store。

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

谢谢!

+0

for iOS5 apple提供在NSURL类中查询NSURL方法。#checkResourceIsReachableAndReturnError: # - isFileReferenceURL # - isFileURL。我没有使用它,但可能是这可以帮助。 – Ravin 2012-03-03 19:09:06

+0

一个简单的测试表明:'[url checkResourceIsReachableAndReturnError:&error]'总是为资产返回NO,无论它们是否存在。任何其他想法? – lar3ry 2012-03-03 23:04:47

+0

顺便说一下,其他两个查询也总是返回NO作为资产URL。 – lar3ry 2012-03-03 23:11:28

回答

5

我有一个类似的问题 - 在resultBlocked我检查资产参数为零 - 如果它为零,那么资产没有找到。