Swift笔记34:ObjectMapper

ObjectMapper的基本使用

1 引入import ObjectMapper
2 创建基本数据模型
(2.1) 建立数据模型,遵守 Mappable
(2.2 ) 实现Mappable协议的方法。required init?(map: ObjectMapper.Map) {}
func mapping(map: ObjectMapper.Map) {}
3 ObjectMapper接收数据,然后就会自动映射到属性,我们可以点语法直接使用

查看demo

需要解析的数据
{
    "list": [
        {
            "id": 1000,
            "avatar": "4e7f0c83ly8g1ho507078j20ro0rojtq.jpg",
            "vip": true,
            "name": "娄艺潇",
            "date": "2020-01-05 22:51",
            "isFollowed": false,
            "text": "潮汕菜太好吃了,暴饮暴食后的我为了明天能穿上演出礼服,不得不徒步走回酒店,边走边锻炼,别夸我敬业,毕竟彩排完我还想吃顿宵夜。[允悲]还有啥推荐的美食不?",
            "images": [
                "4e7f0c83gy1gam2misv31j21hc0u016k.jpg",
                "4e7f0c83gy1gam2mjhk8zj21hc0v6wnx.jpg",
                "4e7f0c83gy1gam2ml6nucj22tc240kjl.jpg",
                "4e7f0c83gy1gam2mn58d3j22tc240qv5.jpg",
                "4e7f0c83gy1gam2mp0x4pj22tc240u0x.jpg",
                "4e7f0c83gy1gam2mr1b81j22tc2407wi.jpg"
            ],
            "commentCount": 2200,
            "likeCount": 11319,
            "isLiked": true
        }
}
创建数据模型
import Foundation
import ObjectMapper

/// 关注名单
struct FocusList: Mappable {
    var list: [UserInfo]?
    mutating func mapping(map: ObjectMapper.Map) {
        list <- map["list"]
    }

    init?(map: ObjectMapper.Map) {}
}

/// 用户信息
class UserInfo: Mappable {
    var id: Int?
    var avatar: String?
    var vip: Bool?
    var name: String?
    var date: Date?
    var isFollowed: Bool?
    var text: String?
    var test: String?
    var images: [Any]?
    var commentCount: Int?
    var likeCount: Int?
    var isLiked: Bool?

    required init?(map: ObjectMapper.Map) {}
    // 如果漏写了map,解析的不到数据,默认为nil
    func mapping(map: ObjectMapper.Map) {
        id <- map["id"]
        avatar <- map["avatar"]
        vip <- map["vip"]
        name <- map["name"]
        isFollowed <- map["isFollowed"]
        text <- map["text"]
        test <- map["test"]
        images <- map["images"]
        commentCount <- map["commentCount"]
        likeCount <- map["likeCount"]
        isLiked <- map["isLiked"]
        date <- (map["date"], DateTransform())
    }
}

struct UserSubDetail: Mappable {
    var desc: String?
    var name: String?
    var num: Int?

    mutating func mapping(map: ObjectMapper.Map) {
        desc <- map["desc"]
        name <- map["name"]
        num <- map["num"]
    }

    init?(map: ObjectMapper.Map) {}
}

具体使用

在不使用嵌套模型,只利用class UserInfo的情况下解析服务器返回的数据并应用。

func loadNewData() {
    let url = GlobalConfig.USERDETAIL_URL
    let parameters = ["key": "value"]
    DispatchQueue.global().async {
        Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON(completionHandler: { [weak self] response in
            guard let res = response.result.value, let weakSelf = self else { return }
            let dic = res as? [String: Any]
            let arr = dic?["list"] as? [[String: Any]]
            guard let arrT = arr else { return }
            weakSelf.userItems.removeAll()
            weakSelf.userItems = Mapper<UserInfo>().mapArray(JSONArray: arrT)
            weakSelf.mTableView.reloadData()
        })
    }
}
print("----1---->", userInfo.id as Any) // Optional(1000)
print("----2---->", userInfo.avatar as Any) // Optional("4e7f0c83ly8g1ho507078j20ro0rojtq.jpg")
print("----3---->", userInfo.vip as Any) // Optional(true)
print("----4---->", userInfo.name as Any) // Optional("娄艺潇")
print("----5---->", userInfo.date as Any) // Optional(1970-01-01 00:33:40 +0000)
print("----6---->", userInfo.text as Any) // Optional("潮汕菜太好吃了")
print("----7---->", userInfo.images as Any) // Optional([4e7f0c83gy1gam2misv31j21hc0u016k.jpg, 4e7f0c83gy1gam2mjhk8zj21hc0v6wnx.jpg, 4e7f0c83gy1gam2ml6nucj22tc240kjl.jpg, 4e7f0c83gy1gam2mn58d3j22tc240qv5.jpg, 4e7f0c83gy1gam2mp0x4pj22tc240u0x.jpg, 4e7f0c83gy1gam2mr1b81j22tc2407wi.jpg])

使用嵌套模型,利用struct FocusList 和 class UserInfo的情况下解析服务器返回的数据并应用。

func loadNewData() {
    let url = GlobalConfig.USERDETAIL_URL
    let parameters = ["key": "value"]
    DispatchQueue.global().async {
        Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON(completionHandler: { [weak self] response in
            guard let res = response.result.value, let weakSelf = self else { return }
            let focusList = Mapper<FocusList>().map(JSONObject: res)
            guard let userItemsTemp = focusList?.list else { return }
            // 逃逸闭包用到self,以及它的属性需要捕获一下.[weak self]表示弱引用,弱引用肯定是可选类型
            weakSelf.userItems.removeAll()
            weakSelf.userItems = userItemsTemp
            weakSelf.mTableView.reloadData()
        })
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容