暑期项目开发实训 Day23
来源:互联网 发布:网络骗贷十六万借呗 编辑:程序博客网 时间:2024/06/11 09:53
记周二全日至今早:
加了一个DataModel, 加了一个AllWeekLists作为中间层(方便测试商业逻辑)
我写的DataModel如下:
//// DataModel.swift// AddPartChecklist//// Created by 黄豪杰 on 2017/7/18.// Copyright © 2017年 黄豪杰. All rights reserved.//import Foundationclass DataModel { var lists = [Checklist]() // 测试数据 struct Variables { static var thisweeklist = Checklist( name: "Week \(Main.Variables.weekID)", weekID: Main.Variables.weekID, monthID: Main.Variables.monthID, yearID: Main.Variables.yearID) static var nextweeklist = Checklist( name: "Week \(Main.Variables.weekID+1)", weekID: Main.Variables.weekID+1, monthID: Main.Variables.monthID, yearID: Main.Variables.yearID) } init() { print("初始化") print("初始化时lists = \(lists.count)") loadChecklists() print("load时lists = \(lists.count)") registerDefaults() handleFirstTime() print("初始化结束") print("WeekUp_Documents folder is\(self.documentsDirectory())") print("WeekUp_Data file path is\(self.dataFilePath())") } func documentsDirectory() -> URL { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) return paths[0] } func dataFilePath() -> URL { return documentsDirectory().appendingPathComponent("Checklists.plist") } // save func saveChecklists() { let data = NSMutableData() let archiver = NSKeyedArchiver(forWritingWith: data) archiver.encode(lists, forKey: "Checklists") archiver.finishEncoding() data.write(to: dataFilePath(), atomically: true) } // load func loadChecklists() { let path = dataFilePath() if let data = try? Data(contentsOf: path) { let unarchiver = NSKeyedUnarchiver(forReadingWith: data) print("decodeObject") lists = unarchiver.decodeObject(forKey: "Checklists") as! [Checklist] unarchiver.finishDecoding() print("finishDecoding") } } func registerDefaults() { let dictionary: [String: Any] = ["ChecklistIndex": -1, "FirstTime": true, "ChecklistItemID": 0 ] UserDefaults.standard.register(defaults: dictionary) } func handleFirstTime() { let userDefaults = UserDefaults.standard let firstTime = userDefaults.bool(forKey: "FirstTime") print("here?") print("firstTime = \(firstTime)") print("lists = \(lists.count)") if firstTime || lists.count == 0 { print("firstTime ...") let checklist1 = DataModel.Variables.thisweeklist let checklist2 = DataModel.Variables.nextweeklist lists.append(checklist1) lists.append(checklist2) indexOfSelectedChecklist = 0 userDefaults.set(false, forKey: "FirstTime") userDefaults.synchronize() } } var indexOfSelectedChecklist: Int { get { return UserDefaults.standard.integer(forKey: "ChecklistIndex") } set { UserDefaults.standard.set(newValue, forKey: "ChecklistIndex") UserDefaults.standard.synchronize() } } class func nextChecklistItemID() -> Int { let userDefaults = UserDefaults.standard let itemID = userDefaults.integer(forKey: "ChecklistItemID") userDefaults.set(itemID+1, forKey: "ChecklistItemID") userDefaults.synchronize() return itemID } }
测试加载数据时,频繁出现datamodel为nil的情况。
查看AppDelegate发现:我在其中声明了常量 dataModel,然后
let controller = AllWeekLists(nibName: "WeekLists", bundle: nil)
而在Main.swift中,因为涉及到跳转操作,controller被重复使用,导致dataModel被多次声明。
@IBAction func enterAll() { // dataModel 被多次声明 let controller = AllWeekLists(nibName:"AllWeekLists", bundle:nil) controller.modalTransitionStyle = .coverVertical self.present(controller,animated:true, completion:nil) }
解决方案:把所有涉及的controller声明为静态常量
let dataModel = DataModel() struct Constants { static let allweeks = AllWeekLists(nibName: "AllWeekLists", bundle: nil) static let thisweek = ThisWeekController(nibName:"ThisWeekController", bundle:nil) static let nextweek = NextWeekController(nibName:"NextWeekController", bundle:nil) }
Constants.allweeks.dataModel = dataModel Constants.thisweek.dataModel = dataModel Constants.nextweek.dataModel = dataModel保证它们共用同一个dataModel。
另外出现的问题:sava无误,plists中具备所有编码信息。但是load时可以加载lists,但是items不能解码。
而我使用的两个controller是 ThisWeek 和 NextWeek。
它们存在重复初始化,导致获取的并不是解码后的list,而是初始化的静态变量
var thisweeklist = DataModel.Variables.thisweeklist
var nextweeklist = DataModel.Variables.nextweeklist
Data Model中的静态变量:
// 测试数据 struct Variables { static var thisweeklist = Checklist( name: "Week \(Main.Variables.weekID)", weekID: Main.Variables.weekID, monthID: Main.Variables.monthID, yearID: Main.Variables.yearID) static var nextweeklist = Checklist( name: "Week \(Main.Variables.weekID+1)", weekID: Main.Variables.weekID+1, monthID: Main.Variables.monthID, yearID: Main.Variables.yearID) }
var nextweeklist: Checklist!
override func viewDidLoad() { nextweeklist = dataModel.lists[1] ......}
这样就解决了解码时的问题。
两种问题的解决方向是类似的。
看看Data Model的初始化可以更细致的了解: load时lists的数量说明解码是没问题的,关键在于没有用同一个lists
init() { print("初始化") print("初始化时lists = \(lists.count)") loadChecklists() print("load时lists = \(lists.count)") registerDefaults() handleFirstTime() print("初始化结束") print("WeekUp_Documents folder is\(self.documentsDirectory())") print("WeekUp_Data file path is\(self.dataFilePath())") }
func handleFirstTime() { let userDefaults = UserDefaults.standard let firstTime = userDefaults.bool(forKey: "FirstTime") print("here?") print("firstTime = \(firstTime)") print("lists = \(lists.count)") if firstTime || lists.count == 0 { print("firstTime ...") let checklist1 = DataModel.Variables.thisweeklist let checklist2 = DataModel.Variables.nextweeklist lists.append(checklist1) lists.append(checklist2) indexOfSelectedChecklist = 0 userDefaults.set(false, forKey: "FirstTime") userDefaults.synchronize() } }
今天是收工阶段,还要解决的问题:
1. NextWeek的DueDate显示问题 (上午)
2. items的toggle问题 (争取上午)
3. 商务逻辑(下午)
4. 界面美化与代码整合 (晚上)
阅读全文
0 0
- 暑期项目开发实训 Day23
- 暑期项目开发实训 Day1
- 暑期项目开发实训 Day2
- 暑期项目开发实训 Day3
- 暑期项目开发实训 Day4
- 暑期项目开发实训 Day4
- 暑期项目开发实训 Day5
- 暑期项目开发实训 Day6
- 暑期项目开发实训 Day7
- 暑期项目开发实训 Day8
- 暑期项目开发实训 Day9
- 暑期项目开发实训 Day9
- 暑期项目开发实训 Day10
- 暑期项目开发实训 Day11
- 暑期项目开发实训 Day12
- 暑期项目开发实训 Day13
- 暑期项目开发实训 Day14
- 暑期项目开发实训 Day15
- 深度工作法让你超越自我
- Centos7安装mplayer播放器和一些简单开发环境的配置
- LSP相关
- iOS 我理解的MVC和MVVM
- CSS-小记
- 暑期项目开发实训 Day23
- 机器学习基石 3.1 Learning with Different Output Space
- Android多媒体开发-- android中OpenMax的实现整体框架
- error C2143: 语法错误 : 缺少“;”(在“*”的前面) error C4430: 缺少类型说明符
- Android中对文件保存、读取和删除操作的实现
- JS--第六天
- Java 集合系列11之 Hashtable源码解析
- 【LeetCode大法】Plus One
- CodeForces 21 D.Traveling Graph(状压DP+Floyd)