我正在使用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 metadata])似乎也没有帮助。
是否有可能附加自定义元数据的方法? setImageData:metadata:completionBlock:看起来很有前途,但只允许修改应用程序创建的资产进行修改。我无法在文档中找到其他解决方案。
任何帮助都将不胜感激。