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
变量中得到了预期的结果。
在 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
变量中得到了预期的结果。