Music_Player3/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift
2024-08-30 16:26:56 +08:00

311 lines
13 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// MPPositive_LoadMusicModel.swift
// MusicPlayer
//
// Created by Mr.Zhou on 2024/4/25.
//
import UIKit
///bload
class MPPositive_BrowseLoadViewModel: NSObject {
static let shared = MPPositive_BrowseLoadViewModel()
///()
var browseModuleLists:[MPPositive_BrowseModuleListViewModel] = []
///
var personalModuleLists:[MPPositive_PersonalListViewModel] = []
///Library
var libraryList:MPPositive_LibraryListViewModel = .init()
//
private var isAction:Bool = false
//
var isRefresh:Bool = false
override init() {
super.init()
setNetWorkBlock()
}
//
private func setNetWorkBlock() {
//browse
MP_NetWorkManager.shared.browseRequestStateBlock = {
[weak self] (lists,isCompleted) in
guard let self = self else {return}
if isAction == false {
if (lists.first?.items.count ?? 0) != 0 {
print("B面预览数据成功拉取")
//
MP_AnalyticsManager.shared.home_b_module_showsucces_actionAction()
}else {
print("B面预览数据拉取失败")
//
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("No Datas")
}
isAction = true
}
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
browseModuleLists.append(contentsOf: lists)
//
browseModuleLists = browseModuleLists.filter{($0.items.count != 0)}
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
}
if isCompleted == true {
//
DispatchQueue.main.async{
[weak self] in
guard let self = self else {return}
//
if let index = browseModuleLists.firstIndex(where: {$0.items.first?.browseItem.pageType == "MUSIC_PAGE_TYPE_ARTIST"}) {
//
let removedElement = browseModuleLists.remove(at: index)
//
browseModuleLists.insert(removedElement, at: 1)
}
//
if let index = browseModuleLists.firstIndex(where: {$0.items.first?.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV"}) {
//
let removedElement = browseModuleLists.remove(at: index)
//
browseModuleLists.append(removedElement)
}
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
//
if browseModuleLists.count != 0 {
cacheResponseData(browseModuleLists)
}
}
}
}
//error
MP_NetWorkManager.shared.browseRequestErrorBlock = {
[weak self] in
guard let self = self else {return}
//
guard let array = chachedData() else {
//
NotificationCenter.notificationKey.post(notificationName: .netWork_error_deal)
return
}
//
browseModuleLists = array
//UI
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
}
}
///
func reloadBrowseLists() {
//
MPPositive_LoadCoreModel.shared.reloadAll{
[weak self] in
guard let self = self else {return}
//
browseModuleLists.removeAll()
//
MP_NetWorkManager.shared.requestBrowseDatas()
//gride
MPPositive_GridLoadViewModel.shared.reloadGrides()
//
getRecentlyData()
}
}
///
func getRecentlyData() {
var lists:[MPPositive_PersonalListViewModel] = []
//
let array = MPPositive_LoadCoreModel.shared.recents
guard array.count >= 3 else {
//
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
return
}
let recentList1:MPPositive_PersonalListViewModel = .init()
recentList1.title = "Recent Played".localizableString()
recentList1.isRecently = true
//
array.forEach { item in
let browse = MPPositive_BrowseItemModel()
browse.coverUrls = [item.recently.reviewImage ?? ""]
browse.title = item.recently.title
browse.subtitle = item.recently.subtitle
browse.videoId = item.recently.videoId
browse.playListId = item.recently.playListID
browse.artistId = item.recently.artistID
browse.pageType = "MUSIC_VIDEO_TYPE_ATV"
browse.itemType = .single
recentList1.items.append(.init(browse))
}
lists.append(recentList1)
let group = DispatchGroup()
group.enter()
getRecommondFirstNumberData(array) { [weak self] personl in
guard let self = self else {return}
if let item = personl {
lists.insert(item, at: 1)
}
group.leave()
}
group.enter()
getRecommondSecondNumberData(array) { [weak self] personl in
guard let self = self else {return}
if let item = personl {
lists.append(item)
}
group.leave()
}
group.notify(queue: .main) {
[weak self] in
guard let self = self else {return}
personalModuleLists = lists
libraryList.reloadLibrarys {
[weak self] in
print("个性化内容组: \(self?.personalModuleLists.count ?? 0)")
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
}
}
}
///1
func getRecommondFirstNumberData(_ recents:[MPPositive_RecentlyViewModel], completetion:((MPPositive_PersonalListViewModel?) -> Void)?){
let personal:MPPositive_PersonalListViewModel = .init()
//1
if let shuffix = recents.randomElement(), let recommendId = shuffix.recently.relatedID {
personal.title = "Because you listen".localizableString()
//
MP_NetWorkManager.shared.requestRecommend(recommendId) { results in
if results.isEmpty == false, let first = results.first {
//
personal.items = first.items
personal.random = shuffix
if let block = completetion {
block(personal)
}
}else {
if let block = completetion {
block(nil)
}
}
}
}
}
///2
func getRecommondSecondNumberData(_ recents:[MPPositive_RecentlyViewModel], completetion:((MPPositive_PersonalListViewModel?) -> Void)?){
let personal:MPPositive_PersonalListViewModel = .init()
//1
if let shuffix = recents.randomElement(), let recommendId = shuffix.recently.relatedID {
personal.title = "Because you like".localizableString()
//
MP_NetWorkManager.shared.requestRecommend(recommendId) { results in
if results.isEmpty == false, results.count > 1 {
let item = results[1]
//
personal.items = item.items
personal.random = shuffix
if let block = completetion {
block(personal)
}
}else {
if let block = completetion {
block(nil)
}
}
}
}
}
///
private func cacheResponseData(_ array: [MPPositive_BrowseModuleListViewModel]) {
guard browseModuleLists.count != 0 else {
print("Home Browse数据未加载无法缓存")
return
}
//jsonData
do{
let jsonData = try JSONEncoder().encode(array)
//使UserDefaults
UserDefaults.standard.set(jsonData, forKey: "HomeBrowse")
print("已经将Home Browse数据缓存")
}catch{
//jsonData
print("Home Browse数据转为Data失败失败原因\(error)")
}
}
//
private func chachedData() -> [MPPositive_BrowseModuleListViewModel]? {
guard let cacheData = UserDefaults.standard.data(forKey: "HomeBrowse") else {
print("获取Home Browse缓存数据失败")
return nil
}
//cacheData[MPPositive_BrowseModuleListViewModel]
do {
let array:[MPPositive_BrowseModuleListViewModel] = try JSONDecoder().decode([MPPositive_BrowseModuleListViewModel].self, from: cacheData)
print("已经将Home Browse缓存数据取出")
return array
} catch {
//jsonData
print("获取Home Browse缓存数据失败失败原因\(error)")
return nil
}
}
//
func pullDownRefresh(_ reloadCompleted:(() -> Void)?) {
//
isRefresh = true
var arrays:[MPPositive_BrowseModuleListViewModel] = []
//
MP_NetWorkManager.shared.requestPullDownHomeBrowse()
//
MP_NetWorkManager.shared.browseRequestStateBlock = {
[weak self] (lists,isCompleted) in
guard let self = self, isRefresh == true else {return}
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
//
arrays.append(contentsOf: lists)
//
arrays = arrays.filter{($0.items.count != 0)}
if isCompleted == true {
//
DispatchQueue.main.async{
[weak self] in
guard let self = self else {
return
}
MPPositive_LoadCoreModel.shared.reloadRecents {
[weak self] in
guard let self = self else {
return
}
getRecentlyData()
}
//
if let index = arrays.firstIndex(where: {$0.items.first?.browseItem.pageType == "MUSIC_PAGE_TYPE_ARTIST"}) {
//
let removedElement = arrays.remove(at: index)
//
arrays.insert(removedElement, at: 1)
}
//
if let index = arrays.firstIndex(where: {$0.items.first?.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV"}) {
//
let removedElement = arrays.remove(at: index)
//
arrays.append(removedElement)
}
//
browseModuleLists = arrays
isRefresh = false
print("更新下拉刷新")
if let block = reloadCompleted {
block()
}
}
}
}
}
}
}