//
// 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
相关推荐
在QT编程中,获取网络上的图片并保存到本地是一个常见的任务,这通常涉及到网络编程模块。QT框架提供了QNetworkAccessManager、QNetworkReply和QNetworkRequest等类来处理这种需求。接下来,我们将深入探讨这些类的...
提供的压缩包文件"内存映射的封装 读和写"可能包含了一个实现了以上功能的代码示例。通过阅读和理解这个代码,你可以更好地了解如何在实际项目中应用内存映射技术。记得在使用任何外部代码时进行充分的测试,以确保...
关键的函数包括`shmget()`用于创建或获取共享内存,`shmat()`用于将共享内存映射到进程的地址空间,以及`shmdt()`用于解除映射。 在给定的场景中,有两个C文件:x1.c(读取程序)和x2.c(写入程序)。以下是它们...
4. **文件删除**: C语言标准库不直接提供删除文件的功能。通常,我们需要调用操作系统特定的函数,如在Unix或Linux中使用`remove()`,在Windows中使用`_unlink()`。例如: ```c #include int main() { remove...
Android为开发者提供了多种方式来管理和访问文件,包括内部存储、外部存储(通常指SD卡)以及外部存储的公共目录。本篇将详细介绍在Android 2.3及更高版本中,如何获取和操作Android设备的内存目录以及SDCard目录。 ...
总的来说,Android远程图片获取和本地缓存涉及到多方面的技术,包括异步处理、内存管理和文件操作。通过合理的缓存策略,不仅可以提高应用性能,还能节省用户流量,提升用户满意度。在实际开发中,还可以利用现有的...
标题和描述中提到的问题涉及到几个关键点:Windows照片查看器无法显示特定的图片,而计算机内存不足可能是导致问题的原因之一,同时其他图片可以正常打开。这种情况通常与图像格式不兼容、系统设置、内存资源管理...
Java提供了丰富的类库支持文件的创建、读写、删除等操作,如`java.io.File`,`java.nio.file.Files`,以及用于处理流的`java.io`包中的类。 总结起来,获取大文件的行数,关键在于使用高效的流式处理方式,并合理...
在图片加载中,内存缓存可以保存已经下载过的图片,当再次请求相同的图片时,可以直接从内存中获取,避免了重复的网络请求。通常,内存缓存会使用LRU(Least Recently Used)算法来管理缓存,当内存不足时,会自动...
若未找到,则查看SD卡缓存,如果存在则读取并加载,同时将图片放入内存缓存;如果SD卡也未找到,才发起网络请求并执行上述步骤。 7. **更新机制**:为了保证缓存图片的时效性,需要设定缓存过期策略。例如,可以...
`FILE_MAP.CPP`、`FileMapWindow.CPP`等文件可能是实现内存映射文件操作的源代码示例,它们可能包含了如何创建、读取和写入内存映射文件的函数或类。 `LOCALHEP.CPP`和`LOCALHEP.H`可能涉及到局部堆的实现,`...
在"写操作工程文件"中,开发者首先会创建一个共享内存对象,通常包括以下步骤: 1. 调用CreateFileMapping函数,传入一个NULL的文件句柄以及一些参数,如内存大小、访问权限等,来创建一个命名的内存映射文件。 2. ...
文件属性通常包括文件名、大小、创建日期、修改日期、访问日期、文件扩展名、隐藏状态、只读状态等。这些信息对于文件管理和操作至关重要。 在C#中,我们可以使用`FileInfo`类来获取文件的属性。`FileInfo`是`...
5. 删除元素:使用`removeChild`方法删除不需要的元素。 6. 保存更改:调用`save`方法保存解析后的修改。 五、注意事项 1. 错误处理:在使用MSXML库时,务必对可能出现的错误进行捕获和处理,如使用`hr`返回值检查...
但可以想象,`test`文件可能是包含这个自定义内存管理池实现的源代码或测试文件。要深入了解这个内存管理池的工作方式,你需要查看源代码,研究其分配和回收策略,以及如何处理内存不足的情况。 总的来说,自定义...
FTP客户端通常包括上传、下载、创建文件和文件夹、删除文件以及进行MD5校验等多种操作。以下将详细阐述这些知识点。 1. **FTP协议**:FTP是Internet上的标准协议,用于在不同主机之间交换文件。它基于TCP/IP协议栈...
本文将深入探讨如何在Android中实现录音、获取录音文件以及控制录音时间,同时也会提及与动画和文件操作相关的知识点。 一、Android录音机制 Android系统提供了MediaRecorder类来处理音频录制。MediaRecorder是一个...
这个过程涉及到多个关键步骤,包括网络请求、文件下载、存储管理和播放控制。以下是对这些知识点的详细解释: 1. **网络请求**: 在Android中,我们通常使用HttpURLConnection或第三方库如OkHttp来发起网络请求,...
本教程将深入探讨如何在MFC环境下,使用C++语言实现XML文件的操作,主要包括XML文件的创建、读取、新增和删除节点。 1. **XML文件的创建**: 在MFC中,我们可以使用MSXML库(Microsoft XML Core Services),它...
本文将深入探讨如何使用MediaStore数据库来获取本地指定文件夹下的视频文件,并进行排序和删除操作。我们将重点关注如何利用Kotlin语言实现这一功能。 首先,我们需要了解MediaStore.Video.Media类,它是MediaStore...