140 lines
4.6 KiB
Swift
140 lines
4.6 KiB
Swift
//
|
|
// MeetViewModel.swift
|
|
// Crush
|
|
//
|
|
// Created by Leon on 2025/9/12.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class MeetViewModel{
|
|
|
|
lazy var requestParams = AIRoleListRequest()
|
|
|
|
/// 可选的筛选参数
|
|
//var filterParams = [String:Any]()
|
|
var filterModel : RolesFilterModel?
|
|
|
|
// 数据存储
|
|
var cards: [MeetCard] = []
|
|
|
|
// 回调闭包
|
|
/// 回调所有数据
|
|
var onCardsLoaded: (([MeetCard]) -> Void)?
|
|
/// 仅分页loadMore
|
|
var onCardsMoreLoaded: (([MeetCard]) -> Void)?
|
|
var onLoadError: ((Error) -> Void)?
|
|
|
|
// 预加载相关
|
|
private var isLoadingMore = false
|
|
|
|
func loadCards(completion: ((Bool, [MeetCard]) -> Void)? = nil){
|
|
|
|
var params = requestParams.toNonNilDictionary()
|
|
|
|
//dicts = dicts.merged(with: filterParams)
|
|
if let filterCondition = filterModel{
|
|
// 筛选条件
|
|
if let sexs = filterCondition.sex, sexs.count > 0, let firstSex = sexs.first{ // 后续可能会改成多选
|
|
params.updateValue(firstSex.rawValue, forKey: "sex")
|
|
}
|
|
|
|
if let age = filterCondition.age{
|
|
params.updateValue(age.rawValue, forKey: "age")
|
|
}
|
|
|
|
if let roleCodes = filterCondition.roleCodeList, roleCodes.count > 0{
|
|
params.updateValue(roleCodes, forKey: "roleCodeList")
|
|
}
|
|
}
|
|
|
|
DiscoverProvider.request(.homeRecommentCardList(params: params), modelType: [MeetCard]?.self) {[weak self] result in
|
|
guard let self = self else{return}
|
|
switch result {
|
|
case .success(let model):
|
|
if let cardsDatas = model {
|
|
self.cards = cardsDatas ?? []
|
|
DispatchQueue.main.async {
|
|
self.onCardsLoaded?(cardsDatas ?? [])
|
|
}
|
|
completion?(true, cardsDatas ?? [])
|
|
}
|
|
case .failure(let error):
|
|
DispatchQueue.main.async {
|
|
self.onLoadError?(error)
|
|
completion?(false, [])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func loadMoreCards() {
|
|
guard !isLoadingMore else { return }
|
|
isLoadingMore = true
|
|
requestParams.pn += 1
|
|
|
|
var params = requestParams.toNonNilDictionary()
|
|
if let filterCondition = filterModel{
|
|
// 筛选条件
|
|
if let sexs = filterCondition.sex, sexs.count > 0, let firstSex = sexs.first{ // 后续可能会改成多选
|
|
params.updateValue(firstSex.rawValue, forKey: "sex")
|
|
}
|
|
|
|
if let age = filterCondition.age{
|
|
params.updateValue(age.rawValue, forKey: "age")
|
|
}
|
|
|
|
if let roleCodes = filterCondition.roleCodeList, roleCodes.count > 0{
|
|
params.updateValue(roleCodes, forKey: "roleCodeList")
|
|
}
|
|
}
|
|
|
|
Hud.showIndicator()
|
|
DiscoverProvider.request(.homeRecommentCardList(params: params), modelType: [MeetCard]?.self) {[weak self] result in
|
|
Hud.hideIndicator()
|
|
|
|
guard let self = self else{return}
|
|
self.isLoadingMore = false
|
|
|
|
switch result {
|
|
case .success(let model):
|
|
// dlog(model)
|
|
if let cardsDatas = model {
|
|
// #warning("test")
|
|
// self.cards.append(contentsOf: [])
|
|
// DispatchQueue.main.async {
|
|
// self.onCardsLoaded?(self.cards)
|
|
// self.onCardsMoreLoaded?([])
|
|
// }
|
|
// return
|
|
// 追加新数据而不是替换
|
|
|
|
self.cards.append(contentsOf: cardsDatas ?? [])
|
|
DispatchQueue.main.async {
|
|
self.onCardsLoaded?(self.cards)
|
|
self.onCardsMoreLoaded?(cardsDatas ?? [])
|
|
}
|
|
}
|
|
case .failure(let error):
|
|
// 加载失败时回退页码
|
|
self.requestParams.pn -= 1
|
|
DispatchQueue.main.async {
|
|
self.onLoadError?(error)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func resetAndLoadCards() {
|
|
requestParams.pn = 1
|
|
cards.removeAll()
|
|
isLoadingMore = false
|
|
loadCards()
|
|
}
|
|
|
|
// 检查是否需要预加载
|
|
func shouldPreload(remainingCount: Int) -> Bool {
|
|
return remainingCount <= 5 && !isLoadingMore
|
|
}
|
|
}
|