You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

198 lines
8.7 KiB

//
// SportViewModels.swift
// HPlusFit
//
// Created by lemo. on 2019/9/15.
// Copyright © 2019 lemo. All rights reserved.
//
import UIKit
class SportViewModels: ViewModel {
var relay = BehaviorRelay<[HealthSection]>(value: [])
/// ()
var sportCategoryVariable = BehaviorRelay<[SectionModel<SportType, SportType>]>(value: [])
///
var cateforyHieghtVariable = BehaviorRelay<CGFloat>(value: 0)
// ()
var selectType: SportType = .placeholder
///
var sportModelArr: [SportModel] = []
/// ()
private var currenTimeStr = DateClass.getCurrentTimeStr(formatStr: "yyyy-MM-dd")
private var queryType: DataQueryType = .day
override init() {
super.init()
//
loadSportData(timeStr: currenTimeStr, queryType: queryType)
monitor()
}
//
func loadSportData(timeStr: String?, queryType: DataQueryType?) {
//
let tempQueryType = queryType == nil ? self.queryType : queryType!
self.queryType = tempQueryType
//
let tempTimeStr = timeStr == nil ? currenTimeStr : timeStr!
currenTimeStr = tempTimeStr
DataBaseManager.shared.querySportData(dataDate: tempTimeStr, queryType: tempQueryType) { [weak self] (results) in
guard let `self` = self else { return }
guard var sportModelArr = results as? [SportModel], sportModelArr.count > 0 else {
self.relay.accept([])
self.sportModelArr = []
return
}
//
sportModelArr.sort { $0.timestamp > $1.timestamp }
self.sportModelArr = sportModelArr
var section = sportModelArr.first?.getSportYearMonth() ?? ""
var dataSource: [HealthSectionItem] = []
var dataVariable: [HealthSection] = []
sportModelArr.enumerated().forEach({ (index, sportModel) in
//
if self.selectType != .placeholder, sportModel.getSportType != self.selectType {
///
if index == sportModelArr.count - 1, dataSource.count > 0 {
if dataSource.count > 0 {
dataVariable.append(HealthSection.health(title: section, items: dataSource))
}
}
return
}
//
let sportYearMonth = sportModel.getSportYearMonth()
if sportYearMonth == section {
dataSource.append(HealthSectionItem.sportItem(viewModel: SportCellViewModels(sportModel: sportModel)))
}else {
if dataSource.count > 0 {
dataVariable.append(HealthSection.health(title: section, items: dataSource))
dataSource.removeAll()
}
dataSource.append(HealthSectionItem.sportItem(viewModel: SportCellViewModels(sportModel: sportModel)))
section = sportYearMonth
}
///
if index == sportModelArr.count - 1 {
dataVariable.append(HealthSection.health(title: section, items: dataSource))
dataSource.append(HealthSectionItem.sportItem(viewModel: SportCellViewModels(sportModel: sportModel)))
}
})
self.relay.accept(dataVariable)
//
self.sportDataHanlde()
}
}
///
func switchSportTypeData(sportType: SportType) {
if sportType == selectType {
return
}
selectType = sportType
sportDataHanlde()
}
///
/// - Parameter sportModel:
func deleteSport(sportModel: SportModel) {
//
// DataBaseManager.shared.deleteSportData(sportTimestamp: sportModel.dataDate)
// //
// loadSportData(timeStr: currenTimeStr, queryType: queryType)
}
//
private func monitor() {
//
kNotificationCenter.rx.notification(Notification.Name(rawValue: DateChangeFireBoltt))
.subscribe(onNext: { [weak self] notication in
guard let `self` = self else { return }
self.currenTimeStr = DateClass.getCurrentTimeStr(formatStr: "yyyy-MM-dd")
self.loadSportData(timeStr: self.currenTimeStr, queryType: self.queryType)
})
.disposed(by: rx.disposeBag)
//
kNotificationCenter.rx.notification(Notification.Name(rawValue: UnitChangeFireBoltt))
.subscribe(onNext: { [weak self] _ in
guard let `self` = self else { return }
self.loadSportData(timeStr: self.currenTimeStr, queryType: self.queryType)
})
.disposed(by: rx.disposeBag)
//
BluetoothService.shared.sportUpdate
.subscribe(onNext: { [weak self] in
guard let `self` = self else { return }
self.loadSportData(timeStr: self.currenTimeStr, queryType: self.queryType)
})
.disposed(by: rx.disposeBag)
}
}
extension SportViewModels {
///
private func sportDataHanlde() {
if sportModelArr.count > 0 {
var section = sportModelArr.first?.getSportYearMonth() ?? ""
var dataSource: [HealthSectionItem] = []
var dataVariable: [HealthSection] = []
sportModelArr.enumerated().forEach({ (index, sportModel) in
//
if self.selectType != .placeholder, sportModel.getSportType != self.selectType {
///
if index == sportModelArr.count - 1, dataSource.count > 0 {
if dataSource.count > 0 {
dataVariable.append(HealthSection.health(title: section, items: dataSource))
}
}
return
}
//
let sportYearMonth = sportModel.getSportYearMonth()
if sportYearMonth == section {
dataSource.append(HealthSectionItem.sportItem(viewModel: SportCellViewModels(sportModel: sportModel)))
}else {
if dataSource.count > 0 {
dataVariable.append(HealthSection.health(title: section, items: dataSource))
dataSource.removeAll()
}
dataSource.append(HealthSectionItem.sportItem(viewModel: SportCellViewModels(sportModel: sportModel)))
section = sportYearMonth
}
///
if index == sportModelArr.count - 1 {
dataVariable.append(HealthSection.health(title: section, items: dataSource))
dataSource.append(HealthSectionItem.sportItem(viewModel: SportCellViewModels(sportModel: sportModel)))
}
})
self.relay.accept(dataVariable)
//
loadSportCategoryData(sports: sportModelArr)
}
}
//
private func loadSportCategoryData(sports: [SportModel]) {
//
var sportTypeArr: [SportType] = [.placeholder]
//
let typeArr = sports.map{ $0.getSportType }
.sorted { (sportType1, sportType2) in return sportType1.rawValue < sportType2.rawValue }
typeArr.enumerated().forEach({ (_, sportType) in
//
if sportType != sportTypeArr.last {
sportTypeArr.append(sportType)
}
})
// rowCount * rowHeight +
let rowCount = sportTypeArr.count > 6 ? 6.0 : CGFloat(sportTypeArr.count)
cateforyHieghtVariable.accept(rowCount * kScaleHeight(45) + 10)
//
sportCategoryVariable.accept([SectionModel(model: self.selectType, items: sportTypeArr)])
}
}