在iOS中存储/加载本地数据的最佳方式是什么?
我是一名初学者(学生)程序员,目前正在构建一个课程目录式的应用程序,我可以查看我学校内某些专业所需的课程。在iOS中存储/加载本地数据的最佳方式是什么?
目前,我做了一个独立的data.swift文件,将所有数据存储为全局数据并制作了一堆huuuuge数组。在主tableview中,我只是从我的data.swift文件加载数据。
data.swift
let data1:[[[[String]]]] = [some datas]
let data2:[[[[String]]]] = [some datas]
let sectionHeaders [[String]] = [some datas]
在我tableviewcontroller,我装载它们做
cell = data1[choice1][choice2][choice3]
...等
但是,我知道,这是不是这样的应该是这样做的,至少xcode告诉我“表达太复杂,无法在合理的时间内解决;考虑将表达式分解成不同的子表达式”在我的数组上=(我只是不知道其他方式=(
我已经实际上搜索了一下,发现有些人推荐plist,一些ppl说sqlite,json,xml等等。
对于存储和加载BIG本地数据,什么是最好/最有效和最快的方法?
谢谢!
我知道你的结构更复杂一些,但我想,以解决多个阵列问题。考虑是这样的:
let teachers = ["Larry Fine", "Curly Howard", "Moe Howard"]
let classNames = ["Calculus 101", "Religious Studies 102", "Teaching with Technology in Film and Media Studies 201"]
,而非使用多个阵列,你可能有一个单一的结构,例如:
struct Course: Codable {
let teacher: String
let className: String
}
然后,您可以表示在一个文本文件中的单个JSON结构,说courses.json
,像这样:
[ { "teacher" : "Larry Fine", "className" : "Calculus 101" }, { "teacher" : "Curly Howard", "className" : "Religious Studies 102" }, { "teacher" : "Moe Howard", "className" : "Teaching with Technology in Film and Media Studies 201" } ]
在斯威夫特4,你会做这样的事情:
var courses: [Course]?
然后从你的包中加载一个JSON文件和填充courses
:
let fileURL = Bundle.main.url(forResource: "courses", withExtension: "json")!
let data = try! Data(contentsOf: fileURL)
courses = try! JSONDecoder().decode([Course].self, from: data)
然后你结束了课程的单个阵列拥有独立teachers
和courseNames
阵列的优势。例如,如果您想按课程名称对课程进行排序,它会确保课程名称和教师名称一起排序。现在,我知道你的结构比这更复杂,所以你的JSON也可能变得更加复杂,但我只想说明(a)自定义对象的想法;和(b)使用Swift 4的新Codable
协议和JSONDecoder
来解析该JSON。
哇,太棒了! ! 非常感谢你!! –
您可以使用UserDefaults类。它很简单,很容易访问。阅读有关您可以检索值的所有不同方式的文档。
保存数据:
let defaults = UserDefaults.standard
defaults.set("Dewan Payroda", forKey: "Name")
检索数据:
let data = defaults.object(forKey: "Name")
print(data)
我会添加一些关于如何加载数据的代码以及您对数据的处理方式,以便我们可以协助您选择最佳的体系结构。 – AlexKoren
JSON是很好的简单格式,可能是阻力最小的方法。您可以在文本编辑器中轻松编辑文件。如果您选择从Web服务获取数据而不是将其构建到您的应用中,它还提供了一个很好的优雅转换路径。你没有提到的一个技术是CoreData,苹果公司对这类本地持久性商店的首选技术,但如果你是新手开发人员,这可能会有点让人费解。根据提供的有限信息,我倾向于JSON。 – Rob
@AlexKorean,增加了一些代码! –