Swift 5中如何将接口返回的JSON数组赋值给ViewModel的数组
问题解决方案
核心问题说明
你当前的代码中,eventService.getEvents的回调参数result枚举的.success状态关联值就是已经解析完成的[EventModel]数组,你之前用下划线忽略了这个值,所以无法完成赋值。
修改后的ViewModel代码
class EventViewModel { private var eventService = EventService() // 修改访问权限为private(set),外部可读、内部可写,符合封装要求 private(set) var eventsArray = [EventModel]() func fetchEventsData(completion: @escaping () -> ()) { eventService.getEvents { [weak self] (result) in guard let self = self else { return } switch result { // 取出success关联的解析后数组 case .success(let eventModels): // 直接赋值即可 self.eventsArray = eventModels completion() case .failure(let error): print("Error processing json data: \(error)") // 可选:错误场景也触发回调,上层可以做空态、错误提示展示 completion() } } } }
上层ViewController调用示例(用于UITableView刷新)
class EventViewController: UIViewController { @IBOutlet weak var tableView: UITableView! let viewModel = EventViewModel() override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self // 触发网络请求 viewModel.fetchEventsData { [weak self] in // 数据赋值完成,刷新列表 self?.tableView.reloadData() } } } extension EventViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return viewModel.eventsArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "EventCell", for: indexPath) as! EventCell let model = viewModel.eventsArray[indexPath.row] // 给cell控件赋值 cell.titleLabel.text = model.title cell.subtitleLabel.text = model.subtitle // 其他属性赋值逻辑自行补充 return cell } }
注意事项
- 原网络请求解析代码中已经把回调切到了主队列,所以上层completion里直接刷新UI不需要再切线程
private(set)修饰eventsArray既保证了数据只能在ViewModel内部修改,又能让上层拿到数据渲染UI,符合MVVM的封装规范- 如果需要支持上拉加载更多,赋值时可以改成
self.eventsArray.append(contentsOf: eventModels),不需要全量覆盖
内容的提问来源于stack exchange,提问作者P-J
相关产品推荐
相关产品推荐

