HandyJSON + RealmSwift 坑

前言

最近要新搞一個項目, 然後選定了數據庫用 RealmSwift, Model 和 JSON 互轉用 HandyJSON
這兩個合起來用( 準確來說, 只是HandyJSON本身的問題 ), 引發了一個問題, JSON 轉 Model 的時候, Model 值一直不出來
後來, 經過一系列排查, 才找到問題所在( 表面問題, 沒去看源碼 ), 然後也算半解決狀態了吧

HandyJSON 版本: 5.0.0
Swift 版本: 5.0

我目前的解決方法,有兩個, 都不是很好, 不過拋轉引玉, 肯定會有更好的方法的 ( 如廣大網友, 有更好的方法, 可以留言 )

示例 JSON 爲

{
	"Name":"老王"
}

先放一開始的代碼

// 繼承 RealmSwift 的 Object, 並且遵守 HandyJSON 協議
class XQTestModel: Object, HandyJSON {

    @objc dynamic var xq_name: String?

    func mapping(mapper: HelpingMapper) {
    	// Name 映射爲 xq_name
        mapper <<<
            self.xq_name <-- "Name"
    }
    
}

很簡單的代碼, 就是把 Name 映射爲 xq_name, 但轉換時, 卻爲空 =_=

排查

有問題, 那肯定有解決辦法. 那麼, 就進入排查階段. ( 說一下思路,不喜的, 直接跳過 )

RealmSwift 和 HandyJson 一起用的時候, 轉換不了. 平常就不會, 那麼, 我們從用了 RealmSwift 之後, 會有那些不一樣的地方開始排查

  1. Object
    類 , 不用 RealmSwift 的 Object, 換成系統的 NSObject, 結果不行, 排除 ( 這裏就可以看出, 其實跟 RealmSwift 無太大關係了 )

  2. @objc
    刪除之後, 還是不行, 排除

  3. dynamic
    刪除之後, 可以了. 那麼可以先縮小範圍在 dynamic 上

  4. mapping
    保持存有 dynamic 字段, 把 xq_name 改回和 JSON 一致 Name, 然後移除 mapping 內容.
    結果是可以的.

那麼先知道了, 映射字段 和 dynamic 這兩個問題所在, 就能離答案更進一步了. 起碼現在知道, 單純只是 HandyJSON 自己不支持 dynamic 和 mapping 混用. 不要錯怪了 RealmSwift

最後想來想去, 就想到以下兩個方法解決.( 感覺算不上解決方案 😢, 其實最好還是去看 mapping 源碼, 估計是這一塊出了問題 )

ps: GitHub 上也有人提了, 不過 HandyJSON 的大佬一直沒去解決 ㄟ( ▔, ▔ )ㄏ

解決辦法1: 直接用後臺傳來的 Key

如果你並不介意直接用後臺傳來的key, 那麼就可以直接聲明

@objc dynamic Name: String?

這樣就算有 dynamic, 也是可以用的. 當然, 如果你願意這樣, 那麼也不會來尋求答案, 那麼可以看看第二種

解決辦法1: 利用 willSet

代碼如下

class XQTestModel: NSObject, HandyJSON {
    
    required override init() {
        super.init()
    }
    
    @objc private var Name: String?
    {
        willSet {
            xq_name = newValue
        }
    }
    
    @objc dynamic var xq_name: String?
    
}

這個方法雖然有點蠢, 主要代碼量太大,但是起碼能解決目前的問題.

ps: 如有更好的方法, 請告訴我, 因爲我也不想再用這麼蠢的方法了 (╯﹏╰)

參考文章

Realm使用中碰到的問題(坑)及解決方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章