浅谈构建iOS一个动态化页面的思路

2023-11-10

       随着产品的不断迭代,功能的不断完善,我们的项目的中会给用户分成区域呈现出越来越多的东西。咕咚的精选给用户一种信息广场的概念,让用户可以快速的抵达我们感兴趣的点。既然如此,那么每一个项目的综合信息的页面经常会被改动。出现位置的调整,出现新的模块的增加,出现模块的删减等等。那么我们就一定要思考我们该如何构建我们这一部分的代码,在一次次的更改后可以用最短的时间完成产品的需求。最大限度的提高我们的工作效率。

下面我们通过咕咚的精选页面来思考一下具体的实现思路


我们看到这个图片的时候先思考一个问题,这么多个分区到底有多少请求接口? 有小伙伴可能说这不是一个接口完成的么? 然后变成一个很复杂的json返回给客户端,然后在慢慢的做解析,我想这样的做法,这个界面每一次更改服务端和客户端都要经历一次代码的拆分,要改很多的东西,这对于两端的开发人员一定是不友好的,我也顺手用charles抓了咕咚的包,验证了我的想法,他们这个界面确实是多个接口组成的。那多个接口能给我们带来什么好处呢?

现在请大家思考一下,如果产品会在下个版本中添加一个模块,调整两个模块之间的顺序,之后还会删减部分模块,甚至出现改变多个分区的顺序的情况的更改?我们如何做修改才能最大化的减少我们的代码逻辑呢,减少我们的工作量呢?

我们的项目最近在做相似模块的重构,我的tableview界面现在每一个分区的位置完全可以根据运营的数据在服务端进行动态的调整位置,可以根据运营的数据,在不改变客户端的代码的情况下动态的去删除一些模块。这又是如何完成的呢?

这里我做的一件事就是动态的绑定 ,我给每一分区的数据整体添加一个固定的identifier此外服务器返回给我一个数据块的排序,我通过这两点生成我tableview的数据源即可。下面是部分实现代码 ,最近我也会写一个小demo放在github上分享给大家,一起高效的完成我们的工作。

首先是请求代码,当然只是伪代码,希望大家主要去了解一种解决方案和思路。使用dispatch_group并发多个请求 在所有请求完成之后完成界面对应的刷新的工作。


将每一个部分看成一个请求即可,我们会把每一个模块的请求结果缓存在本地,下一次请求的时候如果此时数据请求失败,会从本地读取上一次的数据。然后我用伪代码来写一下我和服务器之间约定的返回的基本形式


每一个请求服务器在返回的数据格式中都会告诉我这三个数据。这三个数据就为我模块顺序调整和动态删除的关键。这个时候我就先使用适配器模式给每一个返回书籍模型添加固定属性identifer,因为请求数较小我就用了快排的方式将返回的数据转换成数据模型后根据sort和isUser两个维度创建了我tableview的数据源。

这样在tableView中我们看到的形式就变成了下图的样子 我们完全可以根据identifier动态的去部署我们的每一cell 同理可以设置高度等相关的内容 ,这个大致思路就是如此,最近会写一个小demo,有这个整体一些的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈构建iOS一个动态化页面的思路 的相关文章

  • json_decode 到自定义类

    是否可以将 json 字符串解码为 stdClass 以外的对象 不是自动的 但你可以按照老式的路线来做 data json decode json true class new Whatever foreach data as key g
  • jq:根据 group by 计算嵌套对象值

    Json account 1 cost usage low totalcost 2 01 account 2 cost usage low totalcost 2 25 account 1 cost usage low totalcost
  • 将 jQuery 与 Selenium WebDriver 结合使用 - 如何将 JSON 对象转换为 WebElement?

    我正在使用 Selenium WebDriver 我想执行 jQuery 代码来查找一些元素 我的代码如下 public function uploadGrantDoc script return itemlist grant file u
  • 有序 JSON 对象

    我有一个 servlet 它与数据库通信 然后返回有序 按时间排序 对象的列表 在servlet部分 我有 access DB returns a list of User objects ordered ArrayList users M
  • 使用 lift-json 反序列化具有 Map[String,Any] 属性的案例类

    几天来我一直在努力解决一些通过 lift json 应该很简单的事情 将映射序列化为 JSON 我知道 我知道 根对象还不能是 List 或 Map 但我愿意暂时包装在一个案例类中 但我仍然无法让它工作 感谢一些堆栈溢出帮助 我已经可以进行
  • 如何使用多个 { 'not find' } 来干燥方法?

    我正在尝试优雅地处理以下错误的 JSON 其中Hash fetch似乎不是一个选择 使用 Hash fetch 优雅地处理错误的 JSON https stackoverflow com questions 25193627 handle
  • 如何使用 Jackson 将日期编组为时间戳

    我在将 java util Date 对象编组 取消 到时间戳中时遇到问题 理想情况下 时间戳应采用 UTC 0 格式 而不是服务器的本地时区 尽管如果需要的话我可以很容易地解决这个问题 注意 我知道这里有几个关于堆栈溢出的类似主题 但我遇
  • 如何解析 Newtonsoft JSON 中的 TimeSpan 值

    我想解析 JSON 字符串并使用token Type用于检测类型值的属性JTokenType TimeSpan 我无法弄清楚如何在输入字符串中表达 TimeSpan 所有内容似乎都被解释为 JTokenType String var tim
  • 将json URL导入到java并使用jackson库解析它

    我正在尝试读取 java 中的 json 链接并解析它 以便我可以将它用于其他事务 但问题是我收到错误 我真的不知道该如何处理它们 这是代码 package weather data import weather data import c
  • 在 jQuery 中获取 Json 数据

    没有一个清晰的示例解释如何尽可能简单地拉取 json 数据 我有一个有效的 json 我需要使用 jQuery 检索它 我的 json 输出如下 title blog entries items title Can Members of t
  • Javascript“命名空间”和 jQuery AJAX

    我正在使用此处列出的建议 http www odetocode com articles 473 aspx http www odetocode com articles 473 aspx 使用模拟的JavaScript AJAX网络聊天系
  • WCF 自定义序列化器

    我正在 WCF 中创建一个返回 JSON 的 Web 服务 但 DataContractJsonSerializer 对某些循环引用犹豫不决 在这种特殊情况下我无法删除这些引用 相反 我想使用 Newtonsoft json 库 在 WCF
  • 将Json字符串映射到java中的map或hashmap字段

    假设我从服务器返回了以下 JSON 字符串 response imageInstances one id 1 url ONE two id 2 url TWO 杰克逊代码大厦 JsonProperty 我怎样才能得到HashMap对象出来了
  • 如何将对象转换为 JSON 表示形式

    奇怪的是 我没有找到这个 将对象转换为 JSON 字符串的最简单方法是什么 对象图中的循环等边缘情况对我来说不太感兴趣 让我们找到 A 类简单情况的解决方案 其中包含 B C D 类的一些对象和一些基元 基本的收集支持是必须的 呵呵 我发现
  • Ruby on Rails:如何使用 JSONPath 访问(并保存到数据库)JSON 数组中的嵌套对象/属性?

    我正在尝试将 JSON 对象数组中的数据播种到我的数据库中 我有两个单独的数据库表 属性和单位 一个属性有许多单位 我已经能够通过 API 请求 JSON 数据 然后将其播种到数据库 成功地对属性信息 属性模型 执行此操作 但是 Valua
  • 如何使用 JSON.NET 反序列化?

    如何设置 Newtonsoft Json net 将此文本反序列化为 NET 对象 US Hawaii GMT 10 00 Hawaii US Alaska GMT 09 00 Alaska 为了加分 这种结构在Json中叫什么 我尝试寻找
  • Flot 0.8.2 折线图 - 颜色错误

    我正在使用 Flot 折线图并设置它们的颜色 我发现了一个奇怪的错误 在前 3 种颜色之后 绘图对所有其他线条使用最后一种颜色 这不是正确的行为 更有趣的是图例显示了正确的颜色 这是一个已知的错误 var dataSet label d1
  • 无法通过 REST API 使用 Microsoft Graph API 更新用户配置文件

    我正在尝试在未经用户同意的情况下通过服务器端 Java 应用程序通过 Microsoft Graph API 更新用户配置文件 我在 MS Azure 中有一个应用程序 其中包含以下内容 其他应用程序的权限 Microsoft Graph
  • 将 swift 结构体转换为 json 字符串

    我正在尝试将我的 swift 结构转换为 json 格式 类似这样的问题似乎有不少 但到目前为止 没有一个解决方案对我有用 这是我的结构 struct Rec Codable var name String var time Int var
  • 在redis中存储多个嵌套对象

    我想在redis中存储多个复杂的json数据 但不知道如何 这是我的 json 结构 users user01 username ally email email protected cdn cgi l email protection u

随机推荐

  • yxcms登入后台

    一 在phpstudy搭建yxcms网站 首先下载yxcms的源代码 链接 百度网盘 请输入提取码 提取码 3148 下载好之后将yxcms文件夹放到phpstudy的WWW文件目录下 打开phpstudy 选择网站 gt 创建网站 域名可
  • 利用chrome浏览器reses插件拦截指定js并替换为本地js

    1 chrome浏览器下载安装reses插件 2 配置reses拦截规则 点击添加规则 然后对应位置填入需要拦截的js地址 和本地js地址 然后保存
  • Windows安装Anaconda,创建pytorch环境,pycharm配置环境

    目录 1 简介 2 安装Anaconda 3 创建一个独立的环境 4 安装依赖的库 5 安装pytorch 6 pycharm中使用conda环境 7 到这里安装就结束了 希望对您有所帮助 如有什么错误请指正 1 简介 安装Anaconda
  • 前端开发中一些常用的正则表达式、手机号验证、身份证号码验证、邮箱验证等

    前端开发中一些常用的正则表达式 手机号验证 身份证号码验证 邮箱验证等 一 常用的五个 1 验证手机号码 var phoneReg 1 d 10 0 9 d 7 if phoneReg test phoneVal alert 手机号码格式错
  • 利用ROS采集VLP-16激光雷达数据

    入手VLP 16激光雷达 想用ROS采集雷达数据 按照现有教程总有些小问题 现在把自己成功采集到数据的经过分享一下 希望能对刚入坑的有所帮助 本人使用的Ubuntu16 04 kinetic系统 1 安装驱动 sudo apt get in
  • kube-prometheus 系列2 初始配置

    kube prometheus 安装完后每个组件会都有默认配置 但是如果要满足基本的生产可用 默认配置是不够的 如数据持久化存储等 这篇文章介绍一些常见的需要初始化的配置 prometheus相关配置 kubectl n monitorin
  • 【FreerRTOS按键队列的实现】

    在Freertos中实现单按键和多按键的的读取 1 单按键 include FreeRTOS h include task h include queue h include stm32f4xx hal h define KEY DEBOU
  • 刷脸支付驱动新零售构建全新的消费场景

    毋庸置疑 刷脸支付是一场属于商家与用户的双赢技术 逐渐成为零售行业新的增长点 不但改变着人们的生活方式 支付也将更方便 更快捷 更安全 同时还能为商家带来更多的便利 较大地降低了人工和管理成本 除此之外 3D视觉作为AI感知核心技术 还可以
  • 矩阵图有何用处?XMind完美展示多对多对象间的关系!

    矩阵图是思维导图中运用非常广泛的图形 通俗来说 它其实就是一个表格 但却能非常紧凑的展现出对象之间的多对多关系 它提供的维度至少比其他树形图多一个维度 矩阵图 下图称为MD 表示多对多关系 但是 如何使MD与XMind中的其他图表区别开来
  • 【git】git报错:git checkout xxx error: The following untracked working tree files would be overwritten b

    git报错 git checkout xxx error The following untracked working tree files would be overwritten by checkout README md Pleas
  • SpringBoot实现导入功能

    实体类 gt MeetRestaurantArrange package com krt meet entity import com baomidou mybatisplus annotation TableName import com
  • 小米手机如何安装fiddler证书

    在手机浏览器输入ip port 1 找到设置 2 更多设置 3 系统安全 4 从存储设备安装 以上问题可以解决在fiddler抓包https的问题
  • python 类的__str__方法

    转载自文章 str 方法 当使用print输出对象的时候 只要类中自己定义了 str self 方法 那么就会打印从在这个方法中return的数据 例如 class Cat 定义一个猫类 def init self new name new
  • OpenCV移植到ARM全过程-III

    gt 目录 在上一篇文章里面我们已经交叉编译好了opencv的第三方依赖库 并且解压好了opencv源码 现在开始正式的交叉编译opencv源码 进入opencv源码目录下 上一篇在源码的的根目录下建立了2个文件夹build和output
  • 基于Spring-Data-Elasticsearch 优雅的实现 多字段搜索 + 高亮 + 分页 + 数据同步✨

    持续创作 加速成长 这是我参与 掘金日新计划 10 月更文挑战 的第17天 点击查看活动详情 系列说明 本系列文章基于我的开源微服务项目 校园博客 进行分析和讲解 所有源码均可在GitHub仓库上找到 系列文章地址请见我的 校园博客专栏 G
  • LinearEyeDepth 定义

    UnityCG cginc中原函数如下 Z buffer to linear 0 1 depth 0 at eye 1 at far plane inline float Linear01Depth float z return 1 0 Z
  • 重学STM32---(六)DAC+DMA+TIM

    这两天复习了DAC DMA再加上把基本定时器TIM6和TIM7看了一下 打算写一个综合点的程序 就在网上找了一些关于DAC DMA和定时器相关的程序 最终打算写了输出正弦波的程序 由于没有示波器 也就不能显示出效果了 本来是打算用软件调试看
  • linux获取ipv6公网ip,Linux 获取IPv6网关

    基于hisi3536实现的 ubuntu下只要找到对应的配置文件 ipv6 route 即可 include include include include include include include include include i
  • #ifdef #if defined #ifndef和#if !defined区别 详解-覆盖所有说明

    首先 让我们先从头文件开始 在很多头文件里 我们会看到这样的语句 ifndef MYHEADFILE H define MYHEADFILE H 语句 endif MYHEADFILE H 为了避免同一个文件被include多次 我们常使用
  • 浅谈构建iOS一个动态化页面的思路

    随着产品的不断迭代 功能的不断完善 我们的项目的中会给用户分成区域呈现出越来越多的东西 咕咚的精选给用户一种信息广场的概念 让用户可以快速的抵达我们感兴趣的点 既然如此 那么每一个项目的综合信息的页面经常会被改动 出现位置的调整 出现新的模