IOS开发笔记(十二)——SDWebImage获取网络图片,好友聊天发送图片功能

本文主要是介绍IOS开发笔记(十二)——SDWebImage获取网络图片,好友聊天发送图片功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

中山大学数据科学与计算机学院本科生实验报告

(2019年春季学期)


一、实验题目

IM聊天工具

二、实现内容

  • 使用SDWebImage获取网络图片
  • 好友聊天发送图片功能

三、实验结果

1.SDWebImage获取图片

首先利用cocoapod安装第三方工具SDWebImage

Snip20190601_3

运行命令即可

pod install

在所需要的文件中import相关的库文件

#import "UIImageView+WebCache.h"
简单的使用方法
// 根据url来加载imageView 图片缓存
[self.image sd_setImageWithURL:imageUrl];

其中image是UIImageView类型

其中imageUrl是NSURL类型,注意不是NSString,需要转换

[NSURL URLWithString:imagePath]
添加完成后的函数
// 这里需要使用block 可以在图片加载完成之后做些事情
[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {NSLog(@"这里可以在图片加载完成之后做些事情");}];
添加默认图片

一是可以等待图片从云端加载回来再改变,二是避免网络访问错误的时候图片加载为空的情况。

// 给一张默认图片,先使用默认图片,当图片加载完成后再替换
[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];
具体使用例子

需求:IM聊天工具在用户登陆后会去服务器请求用户的信息,其中就包括用户的头像信息。我们的IM服务器会返回头像图片的url,这时需要客户端在加载的时候更新头像显示图片。

获取图片的url

// 获取用户的信息
-(void) getInfo{AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];NSString *url = [URLHelper getURLwithPath:@"/account/info"];[manager GET:url parameters:nil progress:nilsuccess:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"getInfo success");self.loginUser = [[UserModel alloc] initWithProperties:responseObject[@"data"][@"Username"]NickName:responseObject[@"data"][@"Nickname"]RemarkName:responseObject[@"data"][@"Username"]Gender:responseObject[@"data"][@"Gender"]Birthplace:responseObject[@"data"][@"Region"]// 这里就是头像的urlProfilePicture:responseObject[@"data"][@"Avatar"]];NSLog(responseObject[@"data"][@"Avatar"]);[[DatabaseHelper getInstance] registerNewMessagesListener];[self.socket SRWebSocketOpen];}failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"getInfo fail");NSLog(@"%@", error.localizedDescription);}];
}

根据url来加载网络图片

// 使用SDWebImage第三方库加载网络图片,先设置默认头像等待网络请求// step 1 : 定义UIImageView
UIImageView *imgV = [[UIImageView alloc]init];
// step 2 : 获取url的string后缀
NSString *imagePath = [SERVER_DOMAIN stringByAppendingString:self.User.ProfilePicture];
// step 3 :拼接字符串并转换为url类型
[imgV sd_setImageWithURL:[NSURL URLWithString:imagePath]// step 4 :设置默认图片,在本地的一张图片placeholderImage:[UIImage imageNamed:@"peppa"]// step 5 :加载完成后的函数,输出错误方便我们debugcompleted:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {NSLog(@"error== %@",error);}];

实验效果:

Snip20190601_5

2. 好友聊天发送图片功能

聊天工具离不开图片的发送,这里根据服务器api接口来实现好友之间发送图片的需求。

这里的接口需要上传图片,用到上一周已经实现了的multipart上传。还需要添加时间戳与发送用户的id两个参数在body中。

首先要在聊天界面添加发送图片的按钮
self.imageButton = [UIButton buttonWithType:UIButtonTypeContactAdd];
self.imageButton.frame = CGRectMake(SCREEN_WIDTH - 65, SCREEN_HEIGHT - 45, 40, 40);
[self addSubview:self.imageButton];// 添加点击事件:从图库中选择一张图片
// 选择图片
- (void)chooseImage:(UIButton *)btn
{[self alterHeadPortrait];
}- (void)alterHeadPortrait{PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];// 判断授权情况if (status == PHAuthorizationStatusRestricted ||status == PHAuthorizationStatusDenied) {// 无权限NSLog(@"no auth");}else{NSLog(@"has auth!!!!!");}//初始化提示框UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];//按钮:从相册选择,类型:UIAlertActionStyleDefault[alert addAction:[UIAlertAction actionWithTitle:@"从相册选择" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {//初始化UIImagePickerControllerUIImagePickerController *PickerImage = [[UIImagePickerController alloc]init];//获取方式1:通过相册(呈现全部相册),UIImagePickerControllerSourceTypePhotoLibraryPickerImage.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//允许编辑,即放大裁剪PickerImage.allowsEditing = YES;//自代理PickerImage.delegate = self;//页面跳转[self presentViewController:PickerImage animated:YES completion:nil];}]];//按钮:取消,类型:UIAlertActionStyleCancel[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];[self presentViewController:alert animated:YES completion:nil];
}
设置回调函数

获取完图片后,下一步需要将这个图片上传到服务器,这里调用sendImage函数,实现在下面说明

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *) info{//定义一个newPhoto,用来存放我们选择的图片。UIImage *newPhoto = [info objectForKey:@"UIImagePickerControllerEditedImage"];//    NSLog(urlStr);[self dismissViewControllerAnimated:YES completion:nil];UIImageView *imageView = [[UIImageView alloc] initWithImage:newPhoto];// 上传到云端[[UserManager getInstance] sendImage:@"/content/image" withImage:newPhoto withToUser:self.chatUser.UserID withDate:[NSDate date]];
}
上传图片给好友,与服务器交互

四个参数

  • 后台接口api字段
  • 图片 UImage类型
  • 用户名 NSString类型
  • 时间戳 NSDate类型
// 发送图片给好友
-(void) sendImage:(NSString* )path withImage:(UIImage* )imagewithToUser:(NSString* )userNamewithDate:(NSDate* )timestamp
{AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];[manager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];// 处理urlNSString* urlString = [URLHelper getURLwithPath:path];NSLog(@"%@", urlString);// 添加参数NSDictionary* params = @{@"to":userName, @"timestamp":timestamp};// 发送图片[manager POST:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData){// 图片转dataNSData *data = UIImagePNGRepresentation(image);[formData appendPartWithFileData :data name:@"file" fileName:@"928-1.png"mimeType:@"multipart/form-data"];} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject){NSLog(responseObject[@"msg"]);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error){NSLog(@"sendImage fail");NSLog(@"%@", error.localizedDescription);}];
}

这个与上周的头像图片上传,主要区别是多了一个body的参数,可以在post方法中添加参数即可,若仅需上传图片,则参数填为nil。

四、实验思考及感想

这周首先我主要是使用SDWebImage这个第三方库来完成对网络图片的显示,使用这个库可以方便的加载存储头像这类多次使用的图片,避免加载过于频繁。接着又实现了服务器的另一个接口的交互,完成好友间发送图片的需求。下一步就是如何将发送图片显示在聊天窗口中,之前是利用tableview来显示纯文字,故需要进行修改才能满足图片与文字间隔显示的需求,这个问题留待下周。

这篇关于IOS开发笔记(十二)——SDWebImage获取网络图片,好友聊天发送图片功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/390666

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个