iOS应用程序用户信息操作之用户头像图片存入沙盒及从沙盒中读取图片并显示在头像上

  本文主要解决重启应用程序后,如何从沙盒中正确读取到沙盒中保存的图片并显示的问题。

  沙盒的作用不再赘述。本文主要讲解一般程序开发中关于用户头像的操作问题。此方法可以延伸到其它类似的功能上——将一张图片存入沙盒,本次操作或者重启程序后,依然可以读取到这张图片。

  为了优化流程及缩减数据库的体积,通常我们保存图片的做法是——将图片保存到后台(或沙盒)的某一个位置,然后将该图片存放位置的绝对路径保存到数据库中。

  从iOS 7开始,苹果的沙盒机制有了改变:每一次重启程序后,读取沙盒的Documents目录时,Application下的子目录(类似于72E864E2-EA79-4FD3-A73F-8C5A00E7994D这种名称的文件夹)都是会被改变的,但是该子目录下的Documents、Library和tmp子目录及这三个子目录下的内容依然存在。这就相当于,已经保存的文件还是存在于沙盒里面,但是读取这些文件的路径随着每次重启程序都是变化的。

  因此,如果将图片存入沙盒,将图片所在的绝对位置保存到数据库(比如保存在沙盒的一个plist文件)中,那么应用程序重启后,读取plsit文件中图片的保存路径,将无法获取到图片,因为图片的实际位置已经改变了!

  那么,如何解决这个问题呢?其实很简单。既然沙盒中的Documents文件夹的路径是随着每次重启程序变化的,那么我们可以只在plist文件中存储图像的名称,在每次从plist文件中读取图片名称后,采用通常方法获取到保存图片的沙盒路径,然后将图片名称appending到这个路径下即可。

  如下代码简单演示相关的操作。

1. 创建资源目录并创建一个plist文件


//Model.m文件中

- (void)getTheObjectFromTheFile : (NSString*)fileName {
    
    
    NSString *filePath = [self getTheFilePathOfFile:fileName];
    
    NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath];
    
    NSLog(@"dataDic = %@", dataDic);
    
    [[NSNotificationCenter defaultCenter] postNotificationName:@"localPlistFileDic" object:dataDic];
    
}

- (void)writeTheObject : (NSString*)object forKey : (NSString*)key toTheFile : (NSString*)fileName {
    
    
    NSString *filePath = [self getTheFilePathOfFile:fileName];
    
    NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath];
    
    [dataDic setObject:object forKey:key];
    
    NSLog(@"dataDic = %@", dataDic);
    
    BOOL set = [dataDic writeToFile:filePath atomically:YES];
    
    if(set) {
        
        NSLog(@"写入成功");
        
        [self getTheObjectFromTheFile:fileName];
        
    }else {
        
        NSLog(@"写入失败");
    }
    
    
    
}

- (NSString*)getTheFilePathOfFile : (NSString*)fileName {
    
    
    NSMutableDictionary *dataDic = [[NSMutableDictionary alloc]initWithCapacity:5];

    [dataDic setObject:@"Default" forKey:@"userImage"];

    
    //获取应用程序沙盒里面plist文件的路径
    NSArray *doc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    NSString *docPath = [ doc objectAtIndex:0 ];
    
    NSString *filePath=[docPath stringByAppendingPathComponent:[fileName stringByAppendingString:@".plist"]];
    
    NSMutableDictionary *dd = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath];
    
    NSLog(@"dd = %@", dd);
    
    if (dd == nil || dd == NULL || [dd count] == 0) {
        
        BOOL set = [dataDic writeToFile:filePath atomically:YES];
        
        if(set) {
            
            NSLog(@"写入成功");
        }else {
            
            NSLog(@"写入失败");
        }
        
    }
    
    return filePath;
}

2. 将图片保存到沙盒,并将图片名称保存到沙盒中对应的plist文件中

- (void)saveTheImageToTheSandboxAndTheImageNameToThePlistInTheSandbox {
    
    

    
    //先创建一个fileManager,用于在Documents文件夹下创建一个文件夹,目的是将用户头像保存在这个文件夹下,便于管理。
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    
    
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent: @"UserImageFile"];
    
    // 在Documents文件夹下创建一个名为UserImageFile的目录
    [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
    
    //将图像存入沙盒中
    filePath = [filePath stringByAppendingPathComponent: [NSString stringWithFormat:@"%@.jpg", imageName]];
    
    //下面的这个方法,我是将保存在ImageAssets中的某一张图片保存到刚才的路径下
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@.jpg", iamgeName]]];
    
    
    BOOL result = [UIImagePNGRepresentation(imageView.image)writeToFile: filePath atomically:YES]; // 保存成功会返回YES
    
    if(result) {
        
        NSLog(@"保存成功");
        
        [_model writeTheObject : [NSString stringWithFormat:@"%@.jpg", imageName] forKey : @"userImage" toTheFile : @"plistFileName"];
        
    }else {
        
        NSLog(@"保存失败");
    }
    
}

3. 程序重启后,读取图片并显示

  如上面的内容所讲,读取图片时,需要获取当前沙盒Documents的路径,并将plist中的图片名称appending到路径的后面,具体代码如下:


- (void) viewDidLoad {
    
    //注册通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getLocalPlistFileDic:) name:@"localPlistFileDic" object:nil];
}


- (void)showTheImageFromSandbox {
    
    [_model getTheObjectFromTheFile : @"plistFileName"];
    
    UIImage *userImage = [UIImage imageWithContentsOfFile:_userImageFile];
    
}


//实现通知方法

- (void)getLocalPlistFileDic :(NSNotification*) notification {
    
    NSDictionary *dic = [notification object];
    
    _userImageFile = [dic objectForKey:@"userImage"];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent: @"UserImageFile"];
        
    _userImageFile = [filePath stringByAppendingPathComponent: _userImageFile];
    
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容