`
zjjzmw1
  • 浏览: 1366363 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

自己写的获取网络图片,不放内存里,包括文件的删除,创建

    博客分类:
  • iOS
阅读更多

//

//  UIImageView+CacheURL.m

//  Vodka

//

//  Created by xiaoming on 15/11/5.

//  Copyright © 2015 Beijing Beast Technology Co.,Ltd. All rights reserved.

//

 

#import "UIImageView+CacheURL.h"

#import "CodeFragments.h"

 

@implementation UIImageView (CacheURL)

 

#pragma mark - 传人urlString 和默认图。获取网络图片。----不放到缓存里面

-(void)setURLString:(NSString *)urlString placeholderImage:(UIImage *)image{

    [selfsetURLString:urlString placeholderImage:image relativePath:nil];

}

 

#pragma mark - 传人urlString 和默认图。获取网络图片。----不放到缓存里面 relativePath nil @"" 跟上面的方法一样,都是 tempCache 路径下。

-(void)setURLString:(NSString *)urlString placeholderImage:(UIImage *)defaultImage relativePath:(NSString *)relativePath{

    if (relativePath == nil || [relativePath isEqualToString:@""]) {

        relativePath = @"tempCache";

    }

    self.image = defaultImage;

    if ([self isEmptyString:urlString]) {

        return;

    }

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        UIImage *resultImage = nil;///从网上获取成功后的image

        //从缓存中读取。

        resultImage = [UIImage imageWithContentsOfFile:[self absolutePath:relativePath urlString:urlString systemPath:nil]];

        if (resultImage) {

            dispatch_async(dispatch_get_main_queue(), ^{

                self.image = resultImage;

            });

            return;

        }

        ///没有缓存的情况下。

        NSURL *url = [NSURL URLWithString:urlString];

        NSData *resultData = [NSData dataWithContentsOfURL:url];

        resultImage = [UIImage imageWithData:resultData];

        if (resultImage) {

            ///缓存data数据。

            NSString *aFileName = [self absolutePath:relativePath urlString:nil systemPath:nil];

            NSFileManager *fileManager = [NSFileManager defaultManager];

            if (![fileManager fileExistsAtPath:aFileName]) {

                ////withIntermediateDirectories  YES 表示可以创建多级目录。

                if (![fileManager createDirectoryAtPath:aFileName withIntermediateDirectories:YESattributes:nilerror:nil]) {

                    NSLog(@"createFile error occurred");

                }

                

            }

            NSString *resultFileString = [self absolutePath:relativePath urlString:urlString systemPath:nil];

            if ([resultData writeToFile:resultFileString atomically:YES]) {

                NSLog(@"保存成功");

            }else{

                NSLog(@"保存失败");

            }

            dispatch_async(dispatch_get_main_queue(), ^{

                self.image = resultImage;

            });

        }

    });

}

 

#pragma mark - 判断是否是空字符串

- (BOOL)isEmptyString:(NSString *)string{

    if(string == nil){

        return YES;

    }

    if([string isKindOfClass:[[NSNull null] class]]){

        return YES;

    }

    if([string isEqualToString:@""]){

        return YES;

    }

    if([string isEqualToString:@"<null>"])

        return YES;

    if([string isEqualToString:@"(null)"])

        return YES;

    returnNO;

}

 

#pragma mark - 从本地文件读取数据。

-(NSString *)absolutePath:(NSString*)relativePath urlString:(NSString *)urlString systemPath:(NSString *)systemPath{

    if (relativePath == nil || [relativePath isEqualToString:@""]) {

        relativePath = @"tempCache";

    }

    NSString *path0 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *path1 = [path0 stringByAppendingPathComponent:relativePath];

    if(urlString && ![urlString isEqualToString:@""]){///创建路径的时候不需要url,读,取的时候,需要url

        NSString *path2 = [path1 stringByAppendingPathComponent:[urlString stringByReplacingOccurrencesOfString:@"/"withString:@"_"]];

        return path2;

    }

    return path1;

}

 

#pragma mark - 清除本地缓存

-(void)cleanDisk{

    NSFileManager *fileManager = [NSFileManagerdefaultManager];

    NSString *path0 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *defaultPath = [NSString stringWithFormat:@"%@/tempCache",path0];

    NSLog(@"defaultPaht ==== %@",defaultPath);

    [self folderSizeAtPath:defaultPath];

    if ([fileManager removeItemAtPath:defaultPath error:nil]) {

        NSLog(@"删除成功");

    }else{

        NSLog(@"删除失败");

    }

    

    [self folderSizeAtPath:defaultPath];

}

 

#pragma mark - 通常用于删除缓存的时,计算缓存大小

//单个文件的大小

- (long long) fileSizeAtPath:(NSString*) filePath{

    NSFileManager* manager = [NSFileManagerdefaultManager];

    if ([manager fileExistsAtPath:filePath]){

        return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];

    }

    return 0;

}

#pragma mark - 遍历文件夹获得文件夹大小,返回多少M

- (float ) folderSizeAtPath:(NSString*) folderPath{

    if (!folderPath || [folderPath isEqualToString:@""]) {

        NSString *path0 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

        folderPath = [NSString stringWithFormat:@"%@/tempCache",path0];

    }

    NSFileManager* manager = [NSFileManagerdefaultManager];

    if (![manager fileExistsAtPath:folderPath])

    {

        NSLog(@"大小为0");

        return 0;

    }

    NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath:folderPath] objectEnumerator];

    NSString* fileName;

    long long folderSize = 0;

    while ((fileName = [childFilesEnumerator nextObject]) != nil){

        NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];

        folderSize += [self fileSizeAtPath:fileAbsolutePath];

    }

    NSLog(@"文件大小====%f M ",folderSize/(1024.0*1024.0));

    return folderSize/(1024.0*1024.0);

}

 

@end

 

0
0
分享到:
评论

相关推荐

    QT获取网络图片并保存到本地

    在QT编程中,获取网络上的图片并保存到本地是一个常见的任务,这通常涉及到网络编程模块。QT框架提供了QNetworkAccessManager、QNetworkReply和QNetworkRequest等类来处理这种需求。接下来,我们将深入探讨这些类的...

    内存映射的封装 包含读、写文件

    提供的压缩包文件"内存映射的封装 读和写"可能包含了一个实现了以上功能的代码示例。通过阅读和理解这个代码,你可以更好地了解如何在实际项目中应用内存映射技术。记得在使用任何外部代码时进行充分的测试,以确保...

    C 共享内存读写 2个程序之间传输数据

    关键的函数包括`shmget()`用于创建或获取共享内存,`shmat()`用于将共享内存映射到进程的地址空间,以及`shmdt()`用于解除映射。 在给定的场景中,有两个C文件:x1.c(读取程序)和x2.c(写入程序)。以下是它们...

    c语言文件创建,删除等

    4. **文件删除**: C语言标准库不直接提供删除文件的功能。通常,我们需要调用操作系统特定的函数,如在Unix或Linux中使用`remove()`,在Windows中使用`_unlink()`。例如: ```c #include int main() { remove...

    Android 文件 内存目录获取 sdcard目录获取

    Android为开发者提供了多种方式来管理和访问文件,包括内部存储、外部存储(通常指SD卡)以及外部存储的公共目录。本篇将详细介绍在Android 2.3及更高版本中,如何获取和操作Android设备的内存目录以及SDCard目录。 ...

    Android远程图片获取和本地缓存

    总的来说,Android远程图片获取和本地缓存涉及到多方面的技术,包括异步处理、内存管理和文件操作。通过合理的缓存策略,不仅可以提高应用性能,还能节省用户流量,提升用户满意度。在实际开发中,还可以利用现有的...

    手机上的图片文件传到计算机上后windows照片查看器无法显示此图片,计算机上内存不足,其它图片正常能打开.docx

    标题和描述中提到的问题涉及到几个关键点:Windows照片查看器无法显示特定的图片,而计算机内存不足可能是导致问题的原因之一,同时其他图片可以正常打开。这种情况通常与图像格式不兼容、系统设置、内存资源管理...

    获取上传的文件行数的最快速的java代码

    Java提供了丰富的类库支持文件的创建、读写、删除等操作,如`java.io.File`,`java.nio.file.Files`,以及用于处理流的`java.io`包中的类。 总结起来,获取大文件的行数,关键在于使用高效的流式处理方式,并合理...

    一个带有缓存的下载网络图片的ImageView

    在图片加载中,内存缓存可以保存已经下载过的图片,当再次请求相同的图片时,可以直接从内存中获取,避免了重复的网络请求。通常,内存缓存会使用LRU(Least Recently Used)算法来管理缓存,当内存不足时,会自动...

    网络图片缓存实现

    若未找到,则查看SD卡缓存,如果存在则读取并加载,同时将图片放入内存缓存;如果SD卡也未找到,才发起网络请求并执行上述步骤。 7. **更新机制**:为了保证缓存图片的时效性,需要设定缓存过期策略。例如,可以...

    file_map.zip_C++map_C++文件映射_MAP文件_内存_内存映射文件

    `FILE_MAP.CPP`、`FileMapWindow.CPP`等文件可能是实现内存映射文件操作的源代码示例,它们可能包含了如何创建、读取和写入内存映射文件的函数或类。 `LOCALHEP.CPP`和`LOCALHEP.H`可能涉及到局部堆的实现,`...

    VC++ 共享内存读写操作

    在"写操作工程文件"中,开发者首先会创建一个共享内存对象,通常包括以下步骤: 1. 调用CreateFileMapping函数,传入一个NULL的文件句柄以及一些参数,如内存大小、访问权限等,来创建一个命名的内存映射文件。 2. ...

    asp.net 获取文件属性

    文件属性通常包括文件名、大小、创建日期、修改日期、访问日期、文件扩展名、隐藏状态、只读状态等。这些信息对于文件管理和操作至关重要。 在C#中,我们可以使用`FileInfo`类来获取文件的属性。`FileInfo`是`...

    XML文件的创建和解析

    5. 删除元素:使用`removeChild`方法删除不需要的元素。 6. 保存更改:调用`save`方法保存解析后的修改。 五、注意事项 1. 错误处理:在使用MSXML库时,务必对可能出现的错误进行捕获和处理,如使用`hr`返回值检查...

    自己写的一个内存管理pool

    但可以想象,`test`文件可能是包含这个自定义内存管理池实现的源代码或测试文件。要深入了解这个内存管理池的工作方式,你需要查看源代码,研究其分配和回收策略,以及如何处理内存不足的情况。 总的来说,自定义...

    自己重新封装的C# FTP实现上传,下载,创建文件,文件夹,删除单个文件 MD5校验等

    FTP客户端通常包括上传、下载、创建文件和文件夹、删除文件以及进行MD5校验等多种操作。以下将详细阐述这些知识点。 1. **FTP协议**:FTP是Internet上的标准协议,用于在不同主机之间交换文件。它基于TCP/IP协议栈...

    Android录音 获取录音文件 录音时间

    本文将深入探讨如何在Android中实现录音、获取录音文件以及控制录音时间,同时也会提及与动画和文件操作相关的知识点。 一、Android录音机制 Android系统提供了MediaRecorder类来处理音频录制。MediaRecorder是一个...

    从网络下载视频文件保存到本地

    这个过程涉及到多个关键步骤,包括网络请求、文件下载、存储管理和播放控制。以下是对这些知识点的详细解释: 1. **网络请求**: 在Android中,我们通常使用HttpURLConnection或第三方库如OkHttp来发起网络请求,...

    基于MFC,实现 XML文件的各种操作,包括但不限于XML文件的创建,读取 、新增、删除节点

    本教程将深入探讨如何在MFC环境下,使用C++语言实现XML文件的操作,主要包括XML文件的创建、读取、新增和删除节点。 1. **XML文件的创建**: 在MFC中,我们可以使用MSXML库(Microsoft XML Core Services),它...

    android 通过MediaStore 数据库获取本地指定文件夹下的视频文件 可以排序并删除文件

    本文将深入探讨如何使用MediaStore数据库来获取本地指定文件夹下的视频文件,并进行排序和删除操作。我们将重点关注如何利用Kotlin语言实现这一功能。 首先,我们需要了解MediaStore.Video.Media类,它是MediaStore...

Global site tag (gtag.js) - Google Analytics