美文网首页
MVVM+ReactiveCocoa+Swift4.0 iOS项

MVVM+ReactiveCocoa+Swift4.0 iOS项

作者: 钻石筷子 | 来源:发表于2019-03-05 14:18 被阅读0次

    MVVM+ReactiveCocoa+Swift4.0 iOS项目学习实践(2)

    使用泛型+HandyJSON便捷解析数据模型

    一、swift json数据解析

    1、将网络数据转化为json,推荐使用SwiftyJSON
    官网使用示例如下:
    示例1:

    let json = JSON(data: dataFromNetworking)
    if let userName = json[0]["user"]["name"].string {
      //Now you got your value
    }
    

    示例2:

    let json = JSON(data: dataFromNetworking)
    if let userName = json[999999]["wrong_key"]["wrong_name"].string {
        //Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety
    } else {
        //Print the error
        print(json[999999]["wrong_key"]["wrong_name"])
    }
    

    2、json到数据模型的解析,推荐使用HandyJSONObjectMapper
    2.1、HandyJSON官方使用示例:

    class BasicTypes: HandyJSON {
        var int: Int = 2
        var doubleOptional: Double?
        var stringImplicitlyUnwrapped: String!
    
        required init() {}
    }
    
    let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
    if let object = BasicTypes.deserialize(from: jsonString) {
        // …
    }
    

    2.2、ObjectMapper官方使用示例:

    class User: Mappable {
        var username: String?
        var age: Int?
        var weight: Double!
        var array: [Any]?
        var dictionary: [String : Any] = [:]
        var bestFriend: User?                       // Nested User object
        var friends: [User]?                        // Array of Users
        var birthday: Date?
    
        required init?(map: Map) {
    
        }
    
        // Mappable
        func mapping(map: Map) {
            username    <- map["username"]
            age         <- map["age"]
            weight      <- map["weight"]
            array       <- map["arr"]
            dictionary  <- map["dict"]
            bestFriend  <- map["best_friend"]
            friends     <- map["friends"]
            birthday    <- (map["birthday"], DateTransform())
        }
    }
    
    struct Temperature: Mappable {
        var celsius: Double?
        var fahrenheit: Double?
    
        init?(map: Map) {
    
        }
    
        mutating func mapping(map: Map) {
            celsius     <- map["celsius"]
            fahrenheit  <- map["fahrenheit"]
        }
    }
    

    两个库本身都是十分便捷的库,本身无优劣之分,但针对我们的工程推荐使用HandyJSON,理由如下:
    1、两个解析库都需要继承对应的协议,但HandyJSON不需要以固定的类型初始化对象,对代码的侵入性更少,解析过程简便代码量也有减少。
    2、在ReactiveCocoa中所有的数据模型都要声明为@objc类型,所以要集成与NSObject,而ObjectMapper要继承于Mappable

    二、使用泛型便捷解析网络数据

    1、Swift中加入了泛型,泛型在编程中是一种灵活的语法,在函数、枚举、结构体、类中都得到了充分的应用。

    2、泛型在实际的应用中有很多的用途,这里仅体现在网络数据解析解析中的作用,不做展开说明。
    对于一个APP来说,一般会对应一套应用服务,一般一套的应用服务中返回的json数据,json的外部结构是相同的,内部对应不同的业务会有不同的json数据结构。
    举例说明下:

    {
        returnCode = "";
        costTime = 0;
        message = "操作成功";
        result =     {
            //具体的业务数据对象
        };
    }
    

    以上为一套应用服务返回的数据,可以很明显的看出returnCode、costTime、message为有明确的数据类型,而result是个对象且每一个数据服务的对象不都相同。如果每一个数据接口都写一个model来解析数据,那么最外层的returnCode、costTime、message的解析就需要写多个。如果采用泛型来替代result的数据类型,就可以用一个基础的数据解析模型来实现数据的解析。创建一个基础的数据解析类型如下:

    import UIKit
    
    class MRBaseResponseModel<T>: NSObject {
        var returnCode: String?
        var costTime: Int?
        var message: String?
        var result:T?
    }
    
    

    如果需要解析具体的业务数据解析,创建对应的对象,然后替换泛型对象即可,示例如下:

    class MRBaseResponseResult: NSObject {
        //具体的属性
    }
    
    
    class test{
        let model = MRBaseViewModel<MRBaseResponseResult>()
    }
    
    

    三、泛型+HandyJSON解析数据

    在第二部分的代码中继承HandyJSON协议,实现泛型+HandyJSON的数据解析,示例如下:

    import UIKit
    import HandyJSON
    class MRBaseResponseModel<T>: NSObject,HandyJSON {
        var returnCode: String?
        var costTime: Int?
        var message: String?
        var result:T?
        
        required override init() {}
    }
    
    
    class MRBaseResponseResult: NSObject,HandyJSON {
        var test: String?
        //具体的属性
        required override init() {}
    }
    
    
    class test: NSObject{
        let model = MRBaseResponseModel<MRBaseResponseResult>.deserialize(from: "")
    }
    

    相关文章

      网友评论

          本文标题:MVVM+ReactiveCocoa+Swift4.0 iOS项

          本文链接:https://www.haomeiwen.com/subject/ijonuqtx.html