当前位置: 首页 > news >正文

织梦cms网站更新常州网签备案查询

织梦cms网站更新,常州网签备案查询,青浦郑州阳网站建设,南京广告宣传公司seo引言 在移动应用中#xff0c;图片上传是一个常见的功能#xff0c;尤其是在个人中心或社交平台场景中#xff0c;用户经常需要上传图片到服务器#xff0c;用以展示个人风采或记录美好瞬间。然而#xff0c;实现多图片上传的过程中#xff0c;如何设计高效的上传逻辑并… 引言 在移动应用中图片上传是一个常见的功能尤其是在个人中心或社交平台场景中用户经常需要上传图片到服务器用以展示个人风采或记录美好瞬间。然而实现多图片上传的过程中如何设计高效的上传逻辑并结合用户体验显得尤为重要。 本篇博客将通过一个具体实例——个人中心的相册功能来介绍如何使用 Alamofire 实现多文件上传。我们将从图片选择开始逐步实现图片数据的封装、上传请求的构建以及上传进度的展示最终完成一套完整的多图片上传解决方案。如果你也正在寻找一种高效的实现方法希望本文能为你提供一些思路与启发。 功能需求分析 用户的个人信息页面会展示用户的一些精选照片墙为了补充这个信息在用户编辑页添加了的上传相册图片的功能上传到相册的图片最多为6张可以多选但是已选择和已上传的总数不能超过6。 关于相册选择我们可以使用系统为我们提供的PHPickerViewController来实现使用起来十分方便可以直接设置选择资源类型和最大个数关于它的使用在之前的博客中也有过介绍有兴趣的同学可以看下面这篇博客。 iOS 系统提供的媒体资源选择器PHPickerViewController-CSDN博客文章浏览阅读1.6k次点赞10次收藏20次。在前面的博客中我们已经介绍了一个系统为我们提供的媒体选择器UIImagePickerController它的功能很强大但是唯一的不足就是只能选取单个媒体资源而PHPickerViewController恰恰弥补了这一空缺。PHPickerViewController是iOS 14及更高版本中引入的一个现代化媒体选择器旨在替代UIImagePickerController。它不仅提供了更灵活的媒体选择功能还拥有更现代的用户界面。_phpickerviewcontrollerhttps://blog.csdn.net/weixin_39339407/article/details/140918416选择了相册的图片之后下一步就上传图片资源到相册。Alamofire为我们提供了完整的上传方法但是由于我们需要上传多个资源所以仍然有一些数据来需要我们处理。 接口设计 在讨论如何实现多文件上传之前我们首先需要了解一下后端的接口设计每个服务端对于文件上传的方式都并不是一成不变的。 在上传相册图片的需求中整个过程被分成了两个接口 文件上传接口负责文件上传需要设置文件的类型以及自定义参数来决定文件上传是用来做什么的每次只能上传一个文件。会返回上传后的资源地址。相册更新接口使用上传后的资源地址构建列表来更新相册。 代码实现 那我们跳过关于UI的布局刷新以及照片的选择功能将所有精力集中到文件上传照片选择完成之后会传递回来一个等待上传的图片数组为了更符合业务场景我们需要根据图片数组来构建一组新的相册模型并添加到相册列表然后执行上传操作。 选择照片后的处理 /// 选择相册图片/// - Parameter images: 图片数组func uploadAlbum(images: [UIImage]) {//1. 先刷新for image in images {let model MWEditPhotoModel()model.image imagemodel.uploadStatus .noneeditUserPhotos.append(model)}self.tableView.reloadData()//2.开始执行上传操作self.presenter.requestUploadAlbumData(editPhotoModels: editUserPhotos) {[weak self] inguard let self self else { return }self.tableView.reloadData()}}根据选择上传的图片数组构建新的相册模型并添加到相册列表中刷新列表。将整个相册列表当做参数传递到上传方法中。 首先会根据传递进来的相册列表数据进行过滤获取到需要上传的进行上传 /// 信号量最大并发控制为2private let semaphore DispatchSemaphore(value: 2)/// 上传用户相册func requestUploadAlbumData(editPhotoModels:[MWEditPhotoModel], completion: (() - Void)?) {uploadAlbumCompletion completion// 获取需要上传的模型let needUploadModels editPhotoModels.filter { $0.uploadStatus .none $0.isAdd false }// 上传图片var needUploadCount needUploadModels.countlet semaphore self.semaphoreglobalQueue.async {[weak self] inguard let self self else {return}for model in needUploadModels {model.uploadStatus .uploadingsemaphore.wait()MWLogHelper.debug(开始上传图片,context: MWEditProfilePresenter)self.uploadAlbumImages(model) {[weak self] success inMWLogHelper.debug(上传图片结果\(success),context: MWEditProfilePresenter)defer {// 无论结果如何确保释放信号量semaphore.signal()}guard let self self else {return}if success false {model.uploadStatus .fail}needUploadCount - 1if needUploadCount 0 {self.requestUpdateAlbumData(editPhotoModels: editPhotoModels)}}}}} 首先创建了一个信号量来控制可以同时上传的最大个数。过滤出需要上传的数据执行上传操作。当所有资源上传完成之后在根据列表数据来更新相册。 那我们先来看一下上传方法 // 上传相册图片private func uploadAlbumImages(_ editPhotoModel: MWEditPhotoModel,complection:((Bool)-Void)? nil) {guard let imageData editPhotoModel.image?.compressImageQuality(maxSize: Int(640 * 640)) else {complection?(false)return}MWNetworkHelper.upLoadFile(data: imageData, kinds: photo, fileType: MWUploadFileType.image, fileName: photo.jpg) { result inif let imageUrl result?[photo] {var albumModel MWProfileAlbumModel()albumModel.littleUrl imageUrlalbumModel.srcUrl imageUrleditPhotoModel.albumModel albumModeleditPhotoModel.uploadStatus .successcomplection?(true)} else {editPhotoModel.uploadStatus .failcomplection?(false)}} notRedirectErrorCallback: {complection?(false)MWToast.showToast(MWLocaleStringHelper.getString(Upload Failed))}} /// 上传文件/// - Parameters:/// - data: 文件数据/// - kinds: 参数/// cover 封面, facebookSharedImage 分享, portrait 头像, pic 图片, zip 压缩包, video 视频, , ,photo 相册, photoProcess 相册模糊, liveCover 直播间封面 photoWall, 个人主页, photoWallBig 个人主页大图/// - fileType: 文件类型/// - fileName: 文件名称/// - completion: 上传结果public class func upLoadFile(data: Data, kinds: String, fileType: MWUploadFileType, fileName: String, completion: escaping (([String: String]?) - Void), notRedirectErrorCallback: escaping () - Void) {// 上传地址var url \(MWAPIHost.host)/rest/api/usergate/uploadFile// 上传headervar headers [String:String]()// 重定向let redirectHandler MWRedirectHandler(data: data, kinds: kinds, fileType: fileType, fileName: fileName, completion: completion)AF.upload(multipartFormData: { multipartFormData in//图片var mimeType image/jpgif fileType .video {mimeType video/mp4}multipartFormData.append(data, withName: file,fileName: fileName, mimeType: mimeType)// 上传 kinds 参数if let kindsData kinds.data(using: .utf8) {multipartFormData.append(kindsData, withName: kinds)}}, to: url,method: .post, headers: MWAPIEncryEndpoint.api_postDynamic.headers).redirect(using: redirectHandler).responseJSON { response inif response.response?.statusCode ! 307 {notRedirectErrorCallback()}}} 文件名称和文件类型需要根据文件的具体内容来设置。kinds为服务端自定的参数。关于重定向的暂且可以不考虑我们的文件上传接口进行了接口的重定向一般来讲是不需要单独处理的。文件上传成功之后根据返回结果构建了新的相册数据并同步到相册列表。 最后我们只需要等待所有文件上传完成之后将所有数据同步到相册接口即可 /// 更新用户相册/// - Parameters:/// - editPhotoModels: 编辑相册模型/// - completion: 完成回调func requestUpdateAlbumData(editPhotoModels:[MWEditPhotoModel]) {let needUpdateModels editPhotoModels.filter { $0.uploadStatus .success || $0.uploadStatus .noNeed }let albumList needUpdateModels.map { $0.albumModel }var photoList [[String: Any]]()for albumModel in albumList {var dict [String: Any]()dict[littleUrl] albumModel?.littleUrldict[srcUrl] albumModel?.srcUrlphotoList.append(dict)}let params: [String: Any] [photoList: photoList]MWNetworkHelper.request(endpoint: MWAPIEncryEndpoint.api_updateUserPhotos, parameters: params) {[weak self] (model, data, error) inguard let self self else { return }if error ! nil {for model in needUpdateModels {if model.uploadStatus .success {model.uploadStatus .fail}}}self.uploadAlbumCompletion?()}} 结语 本篇博客主要介绍了使用Alamofire实现多文件的上传功能关于文件上传的具体方案还是需要根据服务端的接口设计来实施。本文以同步用户相册为例将上传相册图片分为两个部分上传和同步当所有资源上传完成之后执行相册的同步操作。并使用信号量来控制上传的最大并发数。 希望本篇博客能够在文件上传中给大家一些启发。
http://www.tj-hxxt.cn/news/134494.html

相关文章:

  • 济南的网站建设公司哪家好响应式网站和自适应
  • 外贸移动商城网站建设中国企业500强入围标准
  • 龙岩网站推广公司wordpress获取文章id方法
  • 5网站建设公司flash网站建设教程视频
  • 天津建设集团网站深圳网站设计兴田德润放心
  • 做常州美食网站首页的背景图电子商城网站的设计与实现
  • 网站备案的规划方案wordpress菜单美化插件
  • 制作网站对话框孵化器网站建设方案
  • 甘肃省建设局网站首页华为荣耀手机官网
  • php做网站框架wordpress 媒体分类
  • 网站群站优化阿里云网站模板
  • 检察门户网站建设管理咨询公司税收优惠
  • 广东网站建设wordpress 小工具 插件
  • 网站空间怎么进推广策划案
  • 荣耀官方网站手机商城网站建设是指
  • 质监局网站建设总结淮安市交通建设局网站
  • 巴中公司网站建设做自己的免费网站
  • 微信公司网站广东阳江最新消息
  • 网站 报价单做科技申报看什么网站
  • 湖北高企达建设有限公司网站北京云建站模板
  • 房屋设计公司网站html制作简单网页
  • 找兼职h5网站开发人员在线crm管理系统
  • 福建工程建设网站网站建设亼仐团
  • 中小企业网站制作费用是多少?给别人做网站赚钱吗
  • 建设网站建设什么挣钱市场调研报告ppt
  • 官方网站建设账务处理网页升级访问永久360
  • 阿里巴巴企业网站怎么做百度信息流是什么
  • 南宁住房建设部网站公司的网站建设哪家比较好
  • 网站文风17模板网网页
  • 宁波 做网站网站怎么做搜索栏