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 中获取集合的异步属性的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

IOS Swift我如何从异步方法中获得价值[重复]

获取文档目录iOS Swift中每个项目的属性

使用核心数据swift ios获取实体的所有属性到tableview中的行中的标签

在CoreData ios swift3中只获取表的几个属性

使用核心数据swift ios将实体的所有属性获取到tableview中的行中的标签

Swift3.0:Get/Post同步和异步请求