// // 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() } }