首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios -在“照片”文件夹中计算图像的总大小

ios -在“照片”文件夹中计算图像的总大小
EN

Stack Overflow用户
提问于 2016-08-16 20:27:48
回答 1查看 196关注 0票数 0

我试图计算在照片文件夹中的图像所占的总存储空间。我编写了如下代码。我可以成功地获取图像,但是这个代码有两个问题-

  1. 如果照片有7000多张图片,有时应用程序就会崩溃。从,日志我理解它的内存问题。
  2. 如果我多次运行这段代码,来回运行,6-7次之后,应用程序就会崩溃。

任何想法都会很有帮助。我需要单独计算视频和歌曲的存储空间。

代码语言:javascript
复制
-(void)getPhotoSize{

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [_allPhotos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
            if (idx<_allPhotos.count&&asset) {

                [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
                    float imageSize = imageData.length;
                    imageSize = imageSize;
                    data.totalPictureSize+=imageSize;
                      _currentPhotoAsset=asset;
                }];
            }
        }];
    });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-16 20:42:26

我不明白您是在分配代码,而不是仅仅运行它,所以我将从下面的示例中删除GCD部件。您还需要运行to来检查泄漏,并找出占用内存的是什么,但我的猜测是,通过直接访问ivar,您有一个隐式的保留周期。试试这个:

代码语言:javascript
复制
-(void)getPhotoSize{
    for (PHAsset *asset in _allPhotos) {
        typeof(self) __weak weakSelf = self; // weak reference to self to avoid retain cycle
        [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
            typeof(self) __strong strongSelf = weakSelf; // strong reference to make sure self exists until the block finishes

            float imageSize = imageData.length;
            imageSize = imageSize;
            strongSelf.data.totalPictureSize+=imageSize;
            strongSelf.currentPhotoAsset=asset;
        }];        
    }
}

我还将其更改为正则for循环,以避免嵌套块。

快速和脏异步版本

代码语言:javascript
复制
-(void)photoSizeWithCompletion:(void (^)(float))completion {
    NSArray *assets = _allPhotos;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        float totalSize = 0;
        for (PHAsset *asset in assets) {
            [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
                totalSize += imageData.length;
            }];        
        }            

        completion(totalSize);
    });
}

就这样说吧:

代码语言:javascript
复制
[someObject photoSizeWithCompletion:^(float totalSize){
    // use the totalSize
}]

这不支持当用户点击后退按钮时取消。但是,我将把它作为家庭作业来查看NSOperationQueue,以实现可取消的异步操作。查看苹果在操作队列和并发性上的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38983896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档