iOS - 在 Swift 中获取集合的异步属性的最佳实践
Posted
技术标签:
【中文标题】iOS - 在 Swift 中获取集合的异步属性的最佳实践【英文标题】:iOS - Best practice to get async properties of collection in Swift 【发布时间】:2016-07-26 08:53:45 【问题描述】:在 Swift 中使用 PHAsset
时,我遇到了一个常见问题,必须有一个好的设计/解决方案。例如,我有一个PHAsset
的集合,比如说assetCollection
。现在我想得到assetCollection
的总大小,这是其中所有资产的总和。
我知道有一个异步 API 可以获取单个资产大小 https://***.com/a/26551990/1084174(在 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
将是最终的集合大小。但我认为对于这样的常见问题必须有一些更好的设计/解决方案。
如果有人建议,将不胜感激。
【问题讨论】:
【参考方案1】:花费数周后,我找到了更好的解决方案。我正在分享我的解决方案,但仍然可能有一些更好的设计。如果你变得更好,请分享。
解决方案
我创建了一个包装器集合,假设sizedAssetCollection
带有一个名为size
的属性。我还实现了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
变量中得到了预期的结果。
【讨论】:
以上是关于iOS - 在 Swift 中获取集合的异步属性的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
使用核心数据swift ios获取实体的所有属性到tableview中的行中的标签
在CoreData ios swift3中只获取表的几个属性