AlassetsLibraryのenumerateGroupSwithTypes:suiltingblock:faildblock:iOS 4.3.4で「壊れている」ですか?
-
25-10-2019 - |
質問
AlassetSlibrary API(4.0以降利用可能)に基づいたiOSアプリを開発しています。これを使用して、デバイスに保存されているすべての画像とビデオを取得していますが、それを行うのは非常に簡単です。とにかく、iPhone 4にiOS 4.3.4をインストールするとすぐに、コードが機能しなくなりました。フェッチを呼び出すラインは何もしません!コードは次のものです(そして、iOS 4.3.3で正常に動作します):
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
ALAssetsGroupEnumerationResultsBlock assetsEnumerator = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
// handle asset
};
ALAssetsLibraryGroupsEnumerationResultsBlock groupsEnumerator = ^(ALAssetsGroup *group, BOOL *stop) {
// handle group
};
ALAssetsLibraryAccessFailureBlock failHandler = ^(NSError *error) {
// handle error
};
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:groupsEnumerator failureBlock:failHandler];
のようだ enumerateGroupSwithTypes:sudingblock:faildblock: 私のブロックが実行されないため、呼び出されることはありません...そしてエラーが発生していません!なんで?私に何ができる?
PS:「タイプ」の引数を変更しようとしましたが、それは問題ではありません!
解決
理由がわかりません(この瞬間、私はあなたを嫌っています!)が、iOS 4.3.4のalassetslibraryはバックグラウンドスレッドでのフェッチを許可しません(一連のシリーズを実行していました NSOperations
で NSOperationQueue
)。私は小さなラッパーを使用して作成することで解決しました performSelectorOnMainThread
.
編集:
コードのリファクタリングとiOS 5へのアップグレードの後、私は最終的に問題が実際にAlassetslibraryの仕組みに関連していることに気付きました。 performSelectorOnMainThread
. ここに投稿を書きました.
他のヒント
非常に重要なこと:
ユーザーは必要です ロケーションサービスを許可します あなたのアプリのために。
Apple Docで書かれているように enumerateGroupSwithTypes:sudingblock:faildblock 方法。
特別な考慮事項
この方法は、ユーザーがロケーションサービスを有効にしていない場合、エラーALASSETSTESTSLIBRARYACCESSGSSGLOBALLYDERIEDERRORで失敗します(設定>一般)。
ユーザーへのアラートを表示して、このケースを処理する必要があります。