201 lines
8.7 KiB
Swift
201 lines
8.7 KiB
Swift
//
|
||
// MPPositive_LoadMusicModel.swift
|
||
// MusicPlayer
|
||
//
|
||
// Created by Mr.Zhou on 2024/4/25.
|
||
//
|
||
|
||
import UIKit
|
||
///b面音乐数据管理load
|
||
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
|
||
|
||
override init() {
|
||
super.init()
|
||
setNetWorkBlock()
|
||
}
|
||
//设置网络请求闭包回调
|
||
private func setNetWorkBlock() {
|
||
//当网络请求工具触发browse请求闭包时
|
||
MP_NetWorkManager.shared.browseRequestStateBlock = {
|
||
[weak self] (lists) 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
|
||
}
|
||
//配置预览模块数据
|
||
browseModuleLists.append(contentsOf: lists)
|
||
//移除为空的数据
|
||
browseModuleLists = browseModuleLists.filter{($0.items.count != 0)}
|
||
//通知首页刷新UI
|
||
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
|
||
}
|
||
//当网络请求工具触发error闭包时
|
||
MP_NetWorkManager.shared.browseRequestErrorBlock = {
|
||
//不继续获取数据
|
||
MP_AnalyticsManager.shared.home_b_module_showfailure_errorAction("Network loading error, no longer updating page data")
|
||
}
|
||
}
|
||
///刷新预览数据
|
||
func reloadBrowseLists() {
|
||
//清空预览模块数据
|
||
browseModuleLists.removeAll()
|
||
//请求预览数据(第一部分)
|
||
MP_NetWorkManager.shared.requestBrowseDatas()
|
||
//同步更新gride
|
||
MPPositive_GridLoadViewModel.shared.reloadGrides()
|
||
}
|
||
///获得最近听过数据以及歌单数据
|
||
func getRecentlyData() {
|
||
//更新本地数据组,之后再网络请求更多数据
|
||
MPPositive_LoadCoreModel.shared.reloadRecents{
|
||
[weak self] in
|
||
guard let self = self else {return}
|
||
var lists:[MPPositive_PersonalListViewModel] = []
|
||
//检索最近听过的数据是否超过三首
|
||
let array = MPPositive_LoadCoreModel.shared.recents
|
||
guard array.count >= 3 else {
|
||
libraryList.reloadLibrarys {
|
||
[weak self] in
|
||
print("个性化内容组: \(self?.personalModuleLists.count ?? 0)")
|
||
//发布刷新通知
|
||
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))
|
||
}
|
||
guard personalModuleLists.isEmpty else {
|
||
//个性化数据已经填充了,不需要自动更新,仅替换第一组的最近听过信息
|
||
personalModuleLists[0] = recentList1
|
||
//更新
|
||
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
|
||
return
|
||
}
|
||
//个性化数据并未填充
|
||
lists.append(recentList1)
|
||
personalModuleLists = lists
|
||
//更新
|
||
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
|
||
libraryList.reloadLibrarys {
|
||
//更新数据
|
||
NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload)
|
||
}
|
||
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
|
||
//更新数据
|
||
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)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//加载更多数据
|
||
func loadMoreBrowseDatas() {
|
||
//检索Browse数据组是否具备数据
|
||
guard browseModuleLists.isEmpty == false else {
|
||
//当前预览数据为空,说明数据加载错误,用户需要重新加载数据
|
||
reloadBrowseLists()
|
||
return
|
||
}
|
||
//已经加载过了,接下来更新预览分页数据
|
||
MP_NetWorkManager.shared.requestContinuationBrowseDatas()
|
||
}
|
||
}
|