iPhone开发之字典转模型——利用创建plist文件和懒加载

2024-08-28 16:32

本文主要是介绍iPhone开发之字典转模型——利用创建plist文件和懒加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、例如九宫格直接从文件中读取信息进行设置创建。但是可重用性不强,如果要在另一个新的控制器中创建一个类似的九宫格,就要把代码整体复制过去进行改动。
2、解决思路:把代码提取出来。
3、xib和storyboard都是用来描述软件界面的。区别如下:
xib是一个 轻量级的软件界面。轻量级意思就是只用来描述一个局部的小的View。  storyboard是一个重量级的描述界面,一般用来描述多个手机界面,以及不同界面之间的跳转。
4、字典转模型
1> 为什么要把字典转模型?
**字典缺陷:
0> 字典属性代码无智能提示。但模型有提示。
1>“键”是字符串,如果写错了,编译器不报错,运行时可能出错,出错了很能找错。
2> 使用“模型”可以方便的使用面向对象的3大特性(封装、继承、多态)性进行扩展。
**什么是模型?  “模型”就是自定义的类,通过为“类”增加各种属性来保存数据。
**字典转模型需要修改哪里的代码?
1> 创建一个模型类
2> 在懒加载的时候,把加载到的数据都放到模型对象中,然后再把模型对象放到数组中。
**  把字典转模型的过程封装到“模型”内部
*原因:将来的这个”模型”可能会在很多地方被用到(比如有很多控制器都会使用这个模型),那么每次用到模型的地方都需要写一次把字典中的数据赋给模型属性的代码,此时如果把这些赋值语句封装到模型内部,会大大简化了使用复杂度与代码量。
*思路:
1>在模型中接受一个NSDictionary的参数,然后在模型内部把NSDictionary中的数据赋值给模型的属性。
2> 封装一个initWithDict方法和一个appWithDict方法。
建议:将模型中的属性名和文件中字典的键值属性相一致。
注意:模型类都建在Supporting  files文件夹下。
5、字典转模型的步骤:
(1)新建.plist文件,根据图片和文字信息编辑.plist文件内容。
(2)在工程的Supporting  files文件夹下新建一个model模型类(CZApp),在类的.h文件中新建成员属性,类型和属性名与plist文件中数组中每个字典元素中的各个键属性一致。
(3)在控制器的.h文件中新建NSArray数组属性app(@property)。
(4)重写数组属性的get方法实现懒加载。
懒加载步骤:
1>  判断下划线数组变量是否为nil,如果为空则开始加载
2> 获取app.plist文件在手机上的路径
3>根据路径加载数据
4>创建一个可变数组用来保存每个模型对象
5> 循环字典数组,把每个字典对象转换成一个模型对象
6> 把可变数组对象赋值给下划线数组变量属性
7>返回下划线数组变量即可  ,具体代码如下所示:
-(NSArray *)apps
{
  if(_apps == nil){
   // 1、获取app.plist文件在手机上的路径
NSString *path = [[NSBundle mainBundle] pathFOrResource:@“app.plist” ofType:nil];
  // 2、根据路径加载数据
NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];
  // 3、创建一个可变数组用来保存每一个模型对象,
NSMutableArray *arrayModels=[NSMutableArray  array];// 一个空的可变数组
   //4、循环字典数组,把每一个字典对象转换成每一个模型对象
  for(NSDictionary *dict  in  arrayDict)
{
      // 创建一个模型
CZApp  *model = [[CZApp alloc] init];
  model.name = dict[@“name”];
  model.icon  =dict[@“icon”];
    // 将模型加到arrayModels中
[arrayModels  addObject: model];
}
    _apps = arrayModels;
  }
return _apps;
}
6、以上步骤改进方案:当字典的键值对很多,即对象属性很多时就会添加很多的代码。
改进方法如下:
(1)为模型类添加初始化对象方法或类方法,参数传进一个字典类型。方法具体声明代码如下:
-(CZApp *)initWithDict:(NSDictionary *)dict;
+(CZApp  *)appWithDict:(NSDictionary *)dict;
(2)方法的实现代码如下:
-(CZApp *) initWithDict:(NSDictionary *)dict
{
   if(self=[super init])
  {
      self.name = dict[@“name”];
      self.icon = dict[@“icon”];
   }
   return self;
}
-(CZApp  *)appWithDict:(NSDictionary *)dict
{
    return  [[self alloc]  initWithDict:  dict];
}
7、最后改进:把模型对象初始化方法的返回值类型改为instancetype。
id与instancetype的介绍:
(1)使用id作为方法返回值的问题:
在接收方法的返回值的时候可以使用任意类型来接收,编译都不报错,但运行时可能出错。
(2)instancetype需要注意的几点:
1> instancetype在类型表示上与id的意思一样,都表示任意对象类型。
2>instancetype只能用作返回值类型,不能像id一样声明变量、用作参数等。
3>使用instancetype,编译器会检测instancetype的真实类型,如果类型不匹配,编译时就出错了(instancetype出现在那个类型中就表示对应的类型)
8、总结:
(1)模型中必须封装初始化对象方法和类方法
(用来传进一个字典类型的参数)
(2)字典转模型:把字典中的数据用模型来保存 。新建一个类,根据键值对的个数,来编写这个类中的属性,将来用这个类的对象的属性来保存字典中每个键对相应的值。















































这篇关于iPhone开发之字典转模型——利用创建plist文件和懒加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

java创建xls文件放到指定文件夹中实现方式

《java创建xls文件放到指定文件夹中实现方式》本文介绍了如何在Java中使用ApachePOI库创建和操作Excel文件,重点是如何创建一个XLS文件并将其放置到指定文件夹中... 目录Java创建XLS文件并放到指定文件夹中步骤一:引入依赖步骤二:创建XLS文件总结Java创建XLS文件并放到指定文件

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV