写真やビデオを取得するために ALAssetsLibrary を使用しており、デバイスに多数のファイルがある場合にアプリのパフォーマンスを改善しようとしています。
アプリの実行中にアセットの変更を検出するために、ALAssetsLibraryChangedNotification を使用して変更されたアセットのディクショナリを取得していますが、アプリが完全に閉じられている (バックグラウンドに送信されているだけではない) 場合、写真が撮影され、アプリが再び開かれます。この場合、私は使用しています:
dispatch_group_t dgroup = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// Group enumerator Block (Go through each album)
void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = [^(ALAssetsGroup *group, BOOL *stopGroup) {
// Successfully completed
if (!group) {
// Finished Enumeration
LogTrace(@"Crawl successfully finished");
return;
}
dispatch_group_async(dgroup, queue, ^{
// Asset enumerator Block (Go through each asset)
[group enumerateAssetsUsingBlock:[^(ALAsset *result, NSUInteger index, BOOL *stopAsset) {
if(!result) {
// Finished all assets in current group
return;
}
// Hash and compare to value in database
}
}
} copy]];
});
dispatch_group_wait(dgroup, DISPATCH_TIME_FOREVER);
LogTrace(@"Finished enumerating assets");
} copy];
// Group Enumerator Failure Block
void (^assetGroupEnumeratorFailure)(NSError *) = [^(NSError *error) {
LogError(@"Upload Refresh Failed");
LogError(@"Album Error: %@ - %@ - %@", [error description], [error localizedDescription], [error localizedRecoverySuggestion]);
[self endOperation];
} copy];
// Sync all groups.
[self.assetsLibrary enumerateGroupsWithTypes: ALAssetsGroupAll
usingBlock: assetGroupEnumerator
failureBlock: assetGroupEnumeratorFailure];
すべてのアセットを列挙し、ハッシュを作成して、ローカルの SQLite データベースに格納されている値と比較します。これは機能しますが、すべてのアセットをハッシュするには非常に長い時間がかかる場合があります。
ハッシュを作成せずに変更を検出するのに役立つ変更日または追加のメタデータはありますか? creationDate プロパティ (ALAssetPropertyDate) については認識していますが、アセットが変更されてもこれは変わりません。残りのメタ データ ([defaultRepresentation メタデータ]) も役に立たないようです。
カスタムメタデータを添付する方法はありますか? setImageData:metadata:completionBlock: は有望に見えましたが、アプリによって作成されたアセットの変更のみを変更できます。ドキュメントで別の解決策を見つけることができませんでした。
どんな助けでも大歓迎です。