ObjectMapper与CoreData结合使用在类初始化时出现访问违例的分析和解决
2018-10-20 16:49
615 查看
版权声明:大熊猫猪·侯佩原创或翻译作品.谢绝转载! hopy https://blog.csdn.net/mydo/article/details/83214738
ObjectMapper是一个便捷的Swift类和JSON互转的库,它为iOS实体模型多提供了一种实现方法.
它可以和CoreData配合完成一些有趣的功能.
但在使用过程中在感受到便捷的同时也发现了一些问题,记录下来供自己和大家参考.
CoreData托管某类实例变量如下:
@NSManaged public var date: Date @NSManaged public var remark: String? @NSManaged public var resultString: String @NSManaged public var habit: Habit?
在其扩展中实现Mappable协议:
public func mapping(map: Map) { date <- (map["traceDate"],DateTransform()) remark <- map["remark"] resultString <- map["resultString"] habit <- (map["habit"],Transforms.transformForHabit) }
需要说明的是,除了一些常见的类型(比如Int,String等),需要在映射时设置合适的转换器.如上所示,对于Date和Habit?类型,分别使用了内置的和我自定义的转换器.
如果不设置,ObjectMapper转换也不会出错,它只是不转换该实例变量而已…
对于自定义转换器的编写也很简单,但超出了本博的主旨,所以有机会单开一个系列再表(先挖坑,填不填另说…)
就这个例子,在托管类初始化时App崩溃了,提示访问违例:
let longHabit = model.allHabits.filter {$0.title.hasPrefix("very")}.first! let date = "2018-9-3".toDate()!.dayBegin let traces = longHabit.tracesByDays[date]! let trace = traces[0] let json = trace.toJSONString()! let new_trace = HabitTrace(JSONString: json) //Crash Here!
我分析原因可能和托管类的托管属性有关!
对于在托管类中被@NSManaged修饰的非可nil实例变量来说,必须在访问前就设置好其值,否则会崩溃!但是对于一些简单类型来说(比如String等),如果你不初始化则自动赋予一个合理的"空值",注意该"空值"不是nil,对于字符串来说它是:""
你可以先赋值,再取值,但万万不可不赋值就取值:
这就是为什么访问date会崩,而访问同样非可nil变量resultString却没问题的原因.
当然如果任何类型是可nil的话,就不存在这个问题了…
所以在该托管类的map初始化器中,我们要给date变量赋予一个值,一种做法是:
public required init?(map: Map) { //初始化description和ctx值 super.init(entity: description, insertInto: ctx) date = Date() }
不过更为恰当的做法是赋予一个"空值":
date = Date(timeIntervalSince1970: 0)
不管你赋予何值,正常情况下他都会被随后的map映射器自动帮你重新设置!不过它的参考来源自然是JSON了. 😉
阅读更多相关文章推荐
- 使用EF6.0出现:CS0029 无法将类型“System.Data.Entity.Core.Objects.ObjectContext”隐式转换为“System.Data.Objects.ObjectContext”错误
- 使用Coredata数据库出现的错误 CoreData: Cannot load NSManagedObjectModel. nil is an illegal URL parameter
- 在使用SSIS设计脚本时候,出现的在PostExecute之外不能锁定变量集合进行读写访问的问题的解决
- 转:XP下使用IIS访问asp出现无权查看网页问题的解决办法
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 解决远古VOD使用域名访问时出现“文件服务器未找到”的错误
- XP下使用IIS访问asp出现无权查看网页问题的解决办法
- IOS之分析网易新闻存储数据(CoreData的使用,增删改查)
- IIS出现“另一个程序正在使用此文件,进程无法访问。”错误提示的解决办法
- 在PHP中使用CURL访问HTTPS时出现certificate verify failed解决办法
- 在使用EFCodeFirst中出现类型“System.Data.Objects.ObjectContext”在未被引用的程序集中定义的解决方案
- CoreData 多线程下NSManagedObjectContext的使用
- coredata 进阶篇——IOS之分析网易新闻存储数据(CoreData的使用,增删改查)
- CoreData 多线程下NSManagedObjectContext的使用
- CoreData: error: Failed to call designated initializer on NSManagedObject 的解决方法
- ScrollView与WebView结合使用时,设置webview字体大小的时候出现下方留白解决
- 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法
- 解决 django1.2环境中使用自带的admin管理界面,配置后访问出现“你无权限修改任何东西” 的问题
- MVC中使用entity framework(EF)出现“必须添加对程序集“System.Data.Entity”解决方法
- 解决listview与scrollview结合使用时出现的问题