MVVM Example

本文通过一个简单的UITableView示例,讲解如何在iOS应用中采用MVVM设计模式。首先创建Model,利用struct解析JSON数据。接着在ViewModel中处理业务逻辑,实现依赖注入。最后在ViewController中绑定ViewModel,利用updateCallback更新UITableView。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVVM Example
用MVVM的设计做一个简单的UITableview
首先是Model
我这里用一个rest api “https://api.tvmaze.com/shows/216?embed=seasons&embed=episodes”
把我想要的properties用struct 列出来,这样在一会破解json的时候比较方便使用
为了方便使用,我这里只需要 _embedded 里的episodes, episodes里有每一集的名字,哪一集,id, 上映时间,简介等信息
这里我会先用playground去测试我写的properties是否正确,还有URLsession是否写的正确

import UIKit

struct object: Decodable {
    let _embedded: embeddedContainer
}

struct embeddedContainer: Decodable {
    let episodes: [episodesContainer]
}

struct episodesContainer: Decodable {
    let number: Int
    let name: String
    let summary: String
}

let urlString = "https://api.tvmaze.com/shows/216?embed=seasons&embed=episodes"
let url = URL(string: urlString)!

URLSession.shared.dataTask(with: url) { (data, _, _) in
    guard let data = data else { return }
    let json = try? JSONDecoder().decode(object.self, from: data)
    print(json)
}.resume()

这里显示格式正确以后,就可以直接复制到model, 然后把URLsession单独写一个function 放到NetworkController的文件里

func loadURL(url: String, completion: @escaping(Data?, URLResponse?, Error?) -> Void) {
    guard let url = URL(string: url) else { return }
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        completion(data, response, error)
    }.resume()
}

因为URLsession是一个closure,那就需要做一个escaping,这样在function的return之后, closure也会被call
Model就直接用刚刚在playground里写好的复制进去就好了

 import UIKit
    
    struct object: Decodable {
        let _embedded: embeddedContainer
    }
    
    struct embeddedContainer: Decodable {
        let episodes: [episodesContainer]
    }
    
    struct episodesContainer: Decodable {
        let number: Int
        let name: String
        let summary: String
    }

ViewModel
ViewModel 里会是一些business logic,这样做优点是会比较容易测试,跟一般的Controller 也会lightweight一些,这里我会用到dependency injection,把所有的function写进一个protocol里,这样一会使用起来会比较方便,也可以把viewModel当成一个单独的property来使用。这里我需要首先把url里的东西放到一个var里,我还需要一个episodes的container返回我所需要的信息,还需要这个var的count,方便一会在UITableView返回count的值。 这里我还写了一个updateCallback,这样在一会tableView里就会知道我的episode的值变了,tableView就会进行更新

在这里插入图片描述
ViewController
在所有我需要的条件就具备以后,这里我就可以直接写一个var,给予这个它viewModelProtocol的property。同时我也需要写一个updateCallback,在我的episodeContainer得到值以后,我就可以reload我的tableView,这样tableView上就可以显示每一集的名字。在updateCallBack里,我需要一个
DispatchQuenue,把它的执行放在main thread上面。
在这里插入图片描述
在这里插入图片描述

总结:
相比于MVC,MVVM可以更清晰的看到背后的business logic,这样方便之后的测试,controller也不会有太多的code同时也方便我们更新以后可能会用到的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值