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

转载 2015年11月18日 11:19:38




    博客分类:

//

//  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_DEFAULT0), ^{

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

        //从缓存中读取。

        resultImage = [UIImage imageWithContentsOfFile:[self absolutePath:relativePath urlString:urlStringsystemPath: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:aFileNamewithIntermediateDirectories: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;

            });

        }

    });

伦理片 http://www.dotdy.com/

 

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

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

    if(string == nil){

        return YES;

    }

    if([string isKindOfClass:[[NSNull nullclass]]){

        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(NSCachesDirectoryNSUserDomainMaskYES)objectAtIndex:0];

    NSString *path1 = [path0 stringByAppendingPathComponent:relativePath];

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

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

        return path2;

    }

    return path1;

}

 

#pragma mark - 清除本地缓存

-(void)cleanDisk{

    NSFileManager *fileManager = [NSFileManagerdefaultManager];

    NSString *path0 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectoryNSUserDomainMaskYES)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:nilfileSize];

    }

    return 0;

}

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

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

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

        NSString *path0 = [NSSearchPathForDirectoriesInDomains(NSCachesDirectoryNSUserDomainMaskYES)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

影音先锋电影 http://www.iskdy.com/

 





关于文件在内存中读写的问题

这两天遇到一个算不上buf
  • fanzhang1990
  • fanzhang1990
  • 2014年09月17日 14:26
  • 826

内存管理之缓存管理(删除文件夹里面的所有内容(文件和文件夹))

/** * キャッシュを削除する(設定のストレジ管理) * * @param context  上下文 * @param cachePath context.g...
  • qq_15623599
  • qq_15623599
  • 2018年01月11日 13:17
  • 37

如何调用自己写的python函数?

https://docs.python.org/2/library/functions.html#abs 假如我在notepad++里写了一个函数如下: def enroll(name, gender...
  • codeksy
  • codeksy
  • 2016年03月31日 10:31
  • 4581

C++ 中编写自己的头文件

我的主力博客:半亩方塘 在使用 struct 关键字自定义类型的时候,通常我们希望自定义的类型能够在不同的源文件中共享,在这种情况下,我们需要把自定义的类型组织成头文件的形式,一般情况下,头文件的文...
  • gcvdsvb
  • gcvdsvb
  • 2014年04月02日 12:08
  • 1397

mysql 临时表和内存表创建 查询 删除以及注意事项

mysql 临时表和内存表创建 查询 删除以及注意事项临时表和内存表的ENGINE 不同,临时表默认的是MyISAM,而内存表是MEMORY ,临时表只对当前会话可见,连接断开时,自动删除! m...
  • yaoyuan_difang
  • yaoyuan_difang
  • 2014年03月05日 11:46
  • 8222

Linux下如何设置权限让用户只删除自己的文件(粘滞位)

linux下粘滞位的概念
  • xxpresent
  • xxpresent
  • 2017年04月01日 17:26
  • 1394

Delphi文件流内存流操作心得

1.  经过实践发现,先把文件流TFileStream独到TMemoryStream中,速度要快一点。如果一边MemoryStream读一边写MemoryStream,例如我用需要加密解密一个文件,不...
  • newweapon
  • newweapon
  • 2008年07月31日 11:34
  • 1559

如何创建内存映射文件,并对其进行写入与读取数据

本文介绍如何使用CreateFileMapping,MapViewOfFile创建内存映射文件,向内存映射文件中写入数据,读取数据。 #include #include #include ...
  • hellokandy
  • hellokandy
  • 2016年09月08日 16:05
  • 2231

JavaScript——如何构建自己的JS库?

一:为什么要构建JS库? 当然,能够更好的实现以后代码的复用,最终达到高效开发的目的。比如我们所见的比较大型和优秀的库。JQuery、Prototype等……里面包含了很多小而精悍的小函数。使用...
  • u011500356
  • u011500356
  • 2015年12月14日 12:16
  • 1084

怎样把文件放在Linux内存里

在Linux中可以将一部分内存mount为分区来使用,通常称之为RamDisk。 RamDisk有三种实现方式: · 第一种就是传统意义上的,可以格式化,然后加载。      这在Linux...
  • shaobingj126
  • shaobingj126
  • 2012年04月10日 14:58
  • 2531
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己写的获取网络图片,不放内存里,包括文件的删除,创建
举报原因:
原因补充:

(最多只允许输入30个字)