2012-03-03 15 views
5

基本的な質問:アセットURLがあり、そのアセットの画像を取得したい場合、そのアセットが実際に存在することを実際にどのように確認していますか?私の言うことの詳細については、私の詳細な説明を以下に見てください。アセットURLが実際に既存のアセットを指しているかどうかを確認するにはどうすればよいですか?

私は、ユーザーが画像を「バンドル」にグループ化して処理するアプリケーションを開発しています。イメージは、iTunes共有、デバイスのカメラ(接続されている場合)、またはデバイスのフォトライブラリから取得できます。さらに、ユーザはいくつかの基本的な方法で画像を編集することができる。 「束」は長生きすることができます。アプリケーションが停止して開始されると、それらは直列化および直列化解除され、アプリケーションの状態は実行間で永続的になります。

オリジナルのデザインでは、画像がアプリケーションのサンドボックスに保存されていました。編集が実行されると、画像は単にローカルファイルに書き換えられます。ただし、バンドルに多数のイメージが含まれていると、イメージ内容の不要な重複が発生し、最適な「ファイルシステム」の使用率が低下する可能性があります。

イメージのアセットライブラリからのイメージの場合、アセットのURLを保存し、実際にイメージまたはそのコンテンツを表示する必要があるときにはいつでもイメージを取得できるようになりました。ユーザーが画像を編集すると、オリジナルのデザインと同様に、ローカルのサンドボックスに書き込まれます。私のアプリケーションは、イメージがローカルファイルシステムか資産ライブラリから来ているかどうかを追跡します。

私のアプリケーションがアクティブでないときに問題が発生します。ユーザーは、自分のアプリケーションがURLポインタを格納している画像を含め、フォトアプリに入り、自由に画像を削除することができます。

私は "What if?"ユーザーがこのようなことをしていたなら、私のアプリケーションで何が起こるかを調べるテスト。私が起こったことは予想外のことでした。私は障害ブロックに到達することはありません、私のテストで

[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. 
     } 
    }]; 

:私は、次のコードを使用して、資産のURLを持っているすべての画像を確認し、バンドルのリストを歩くハンドラを書きました。 Appleのマニュアルには「」と表示されています。ユーザーがアプリケーションへのアクセスを拒否した場合や、データにアクセスするアプリケーションがない場合は、エラーブロックが呼び出されます。「URLが存在しない場合は何も起こりません。確かに私のテストでは、「UUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXのアセットが見つかりませんでした」(XXXは元のURLのUUIDに置き換えられました)というNSLog()メッセージが書かれています。しかし、それは十分ではありません。私はまだ画面上のView Controller上にあるUIImageViewのイメージを見ることができます。そして、View Controllerを親にポップすると、システムがリセットされます。

私の質問は、資産URLが実際に存在するかどうかを判断する方法はありますか?私はイメージを除外しなければならないのは気にしません(結局のところ、ユーザーはイメージを削除した人です!)。私は一貫してデバイスの再起動につながる既知の動作上のパスを持つという考えが嫌いです。私はこの動作のアプリケーションをApp Storeに提出することはできません。

提案がありますか?私が答えを待っている間、私はまだいくつかのアイデアをテストしているつもりですが、人々が私に与えることができるどんな提案も使用できます。

ありがとうございます!

+0

for iOS5 appleは、NSURLクラスのNSURLメソッドのクエリを提供します。#checkResourceIsReachableAndReturnError: # - isFileReferenceURL # - isFileURL。私はそれを使用していないが、これは助けることができるかもしれません。 – Ravin

+0

簡単なテストでは、次のことが分かりました: '[url checkResourceIsReachableAndReturnError:&error]'は、アセットの有無にかかわらず常にNOを返します。他のアイデア? – lar3ry

+0

他の2つのクエリは、途中でアセットURLに対しても常にNOを返します。 – lar3ry

答えて

5

私は同様の問題を抱えていました。結果として、ブロックされました。nilの資産パラメータをチェックしました。もしそれがnilであれば、資産は見つかりませんでした。