我正在使用 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: 看起来很有希望,但只允许修改应用程序创建的资产。我无法在文档中找到另一个解决方案。
任何帮助,将不胜感激。