iOS - 在 Swift 中获取集合的异步属性的最佳实践

iOS - Best practice to get async properties of collection in Swift

在 Swift 中使用 PHAsset 时,我遇到了一个常见问题,必须有一个很好的 design/solution。例如,我有一个 PHAsset 的集合,比方说 assetCollection。现在我想获得 assetCollection 的总大小,这是其中所有资产的总和。

我知道有一个异步 API 来获取单个资产大小 (在 objective-c 中),

[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
        float imageSize = imageData.length;
        //convert to Megabytes
        imageSize = imageSize/(1024*1024);
        NSLog(@"%f",imageSize);
 }];

但是当它是一个集合时,我该如何设计解决方案?

我的想法是,我可以在 assetCollection 中对 total 变量中的每个资产在循环内 运行 异步调用,直到我得到最后的结果(可能使用全局变量)。 total 将是最终的集合大小。但我认为一定有更好的design/solution来解决这种常见问题。

如有建议,将不胜感激

经过几周的努力,我找到了一个更好的解决方案。我正在分享我的解决方案,但仍然可能有一些更好的设计。如果你有更好的,请分享。

解决方案

我创建了一个包装器集合,假设 sizedAssetCollection 带有一个名为 size 的 属性。我还实现了 add()remove() 方法。当我通过 add/remove 方法添加或删除项目时,我会计算动态更新 size。喜欢,

void add (PHAsset *asset) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
        float imageSize = imageData.length;
        imageSize = imageSize/(1024*1024);
        size += imageSize;
 }];
}


void remove(PHAsset *asset) {
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
        float imageSize = imageData.length;
        imageSize = imageSize/(1024*1024);
        size -= imageSize;
 }];
}

最后我在 size 变量中得到了预期的结果。