对网络请求内容的一次优化

This commit is contained in:
Mr.zhou 2024-05-21 15:31:45 +08:00
parent 97297c7c55
commit e37d80fbd3
8 changed files with 164 additions and 58 deletions

View File

@ -66,7 +66,6 @@ class MP_LunchViewController: UIViewController {
progressView.setProgress(value)
}
}else {
print("进度已满")
// DispatchQueue.main.async {
// [weak self] in
// guard let self = self else {return}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22757" systemVersion="23E224" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="MPPositive_CollectionArtistModel" representedClassName="MPPositive_CollectionArtistModel" syncable="YES" codeGenerationType="class">
<entity name="MPPositive_CollectionArtistModel" representedClassName="MPPositive_CollectionArtistModel" syncable="YES">
<attribute name="artistId" optional="YES" attributeType="String"/>
<attribute name="coverImage" optional="YES" attributeType="URI"/>
<attribute name="subtitle" optional="YES" attributeType="String"/>

View File

@ -17,6 +17,9 @@ typealias ListRequestResultBlock = (_ list:MPPositive_ListAlbumListViewModel) ->
class MP_NetWorkManager: NSObject {
//
static let shared = MP_NetWorkManager()
//MARK: -
///
private let MPSession = Alamofire.Session(interceptor: MP_CustomRetrier())
//MARK: - API
///
private let header:String = "https://music.youtube.com"
@ -129,6 +132,25 @@ class MP_NetWorkManager: NSObject {
let queue = DispatchQueue(label: "MPNetWorkManager")
monitor.start(queue: queue)
}
///
private func requestStatusToYouTube(_ isAilable:@escaping(Bool) -> Void) {
//
let reachabilityManager = NetworkReachabilityManager(host: "https://music.youtube.com/")
//ping
reachabilityManager?.startListening(onUpdatePerforming: { status in
switch status {
case .unknown://
isAilable(false)
print("网络情况未知")
case .notReachable://
isAilable(false)
print("网络不可用")
case .reachable(.ethernetOrWiFi), .reachable(.cellular)://
//
isAilable(true)
}
})
}
}
//MARK: - API
extension MP_NetWorkManager {
@ -167,16 +189,19 @@ extension MP_NetWorkManager {
]
]
]
requestPostHomeBrowse(url, parameters: parameters)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostHomeBrowse(url, parameters: parameters)
}
}
}
}
//
private func requestPostHomeBrowse(_ url:URL, parameters:Parameters) {
//postRootBrowses
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonBrowses.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonBrowses.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
if value.responseContext?.visitorData != nil {
@ -230,14 +255,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostAlbumOrList(url, parameters: parameters) { results in
comletion(results)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostAlbumOrList(url, parameters: parameters) { results in
comletion(results)
}
}
}
}
///
private func requestPostAlbumOrList(_ url:URL, parameters:Parameters, comletion:@escaping (MPPositive_ListAlbumListViewModel) -> Void) {
//postRootBrowses
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonListOrAlbum.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonListOrAlbum.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -286,14 +315,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostArtist(url, parameters: parameters) { result in
comletion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostArtist(url, parameters: parameters) { result in
comletion(result)
}
}
}
}
//
private func requestPostArtist(_ url:URL, parameters:Parameters, comletion:@escaping (MPPositive_ArtistViewModel) -> Void) {
//postRootBrowses
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonArtist.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonArtist.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -341,14 +374,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostArtistMore(url, parameters: parameters) { result in
comletion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostArtistMore(url, parameters: parameters) { result in
comletion(result)
}
}
}
}
///
private func requestPostArtistMore(_ url:URL, parameters:Parameters, comletion:@escaping (([MPPositive_BrowseItemViewModel], String?, String?)) -> Void) {
//postRootBrowses
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonArtistMore.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonArtistMore.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -393,14 +430,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostArtistMoreContinuation(url, parameters: parameters) { result in
comletion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostArtistMoreContinuation(url, parameters: parameters) { result in
comletion(result)
}
}
}
}
///
private func requestPostArtistMoreContinuation(_ url:URL, parameters:Parameters, comletion:@escaping (([MPPositive_BrowseItemViewModel], String?, String?)) -> Void) {
//postRootBrowses
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonArtistMore.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonArtistMore.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -446,16 +487,20 @@ extension MP_NetWorkManager {
]
]
]
//next
requestPostNextList(url, parameters: parameters) { listSongs in
//
completion(listSongs)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
//next
self.requestPostNextList(url, parameters: parameters) { listSongs in
//
completion(listSongs)
}
}
}
}
//next
private func requestPostNextList(_ url:URL, parameters:Parameters, completion:@escaping (([MPPositive_SongItemModel]) -> Void)) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonNext.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonNext.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -497,15 +542,19 @@ extension MP_NetWorkManager {
]
]
]
//next/
requestPostNextLyricsAndRelated(url, parameters: parameters) { result in
completion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
//next/
self.requestPostNextLyricsAndRelated(url, parameters: parameters) { result in
completion(result)
}
}
}
}
//Next/
private func requestPostNextLyricsAndRelated(_ url:URL, parameters:Parameters, completion:@escaping(((String?,String?)) -> Void)) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonNext.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonNext.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -547,14 +596,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostPlayer(url, parameters: parameters){ resourceUlrs, coverUrls in
completion(resourceUlrs, coverUrls)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostPlayer(url, parameters: parameters){ resourceUlrs, coverUrls in
completion(resourceUlrs, coverUrls)
}
}
}
}
///
private func requestPostPlayer(_ url:URL, parameters:Parameters, completion:@escaping((([String],[String]), [String]?) -> Void)) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonPlayer.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonPlayer.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
@ -598,14 +651,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostLyric(url, parameters: parameters) { lyrics in
completion(lyrics)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostLyric(url, parameters: parameters) { lyrics in
completion(lyrics)
}
}
}
}
//
private func requestPostLyric(_ url:URL, parameters:Parameters, completion:@escaping((String) -> Void)) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonLyrics.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonLyrics.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -644,14 +701,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostRecommend(url, parameters: parameters) { results in
completion(results)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostRecommend(url, parameters: parameters) { results in
completion(results)
}
}
}
}
///
private func requestPostRecommend(_ url:URL, parameters:Parameters, completion: @escaping ([MPPositive_RecommendListViewModel]) -> Void) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonRecommend.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonRecommend.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -696,14 +757,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostSearchSuggestions(url, parameters: parameters) { result in
completion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostSearchSuggestions(url, parameters: parameters) { result in
completion(result)
}
}
}
}
//
private func requestPostSearchSuggestions(_ url:URL, parameters:Parameters, completion:@escaping(([[MPPositive_SearchSuggestionItemModel]]) -> Void)) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchSuggestions.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchSuggestions.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -746,14 +811,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostSearchPreviewResults(url, parameters: parameters) { result in
completion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostSearchPreviewResults(url, parameters: parameters) { result in
completion(result)
}
}
}
}
//
private func requestPostSearchPreviewResults(_ url:URL, parameters:Parameters, completion:@escaping (([MPPositive_SearchResultListViewModel]) -> Void)) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchPreviewResults.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchPreviewResults.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -802,14 +871,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostSearchTypeResults(url, parameters: parameters) { result in
completion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostSearchTypeResults(url, parameters: parameters) { result in
completion(result)
}
}
}
}
//
private func requestPostSearchTypeResults(_ url:URL, parameters:Parameters, completion:@escaping (([MPPositive_SearchResultItemViewModel], String?, String?))->Void) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchTypeResults.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchTypeResults.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -858,14 +931,18 @@ extension MP_NetWorkManager {
]
]
]
requestPostSearchTypeContinuation(url, parameters: parameters) { result in
completion(result)
requestStatusToYouTube { isAvailable in
if isAvailable == true {
self.requestPostSearchTypeContinuation(url, parameters: parameters) { result in
completion(result)
}
}
}
}
//
private func requestPostSearchTypeContinuation(_ url:URL, parameters:Parameters, completion:@escaping (([MPPositive_SearchResultItemViewModel], String?, String?))->Void) {
//post
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchTypeContinuation.self) { [weak self] (response) in
MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonSearchTypeContinuation.self) { [weak self] (response) in
guard let self = self else {return}
switch response.result {
case .success(let value):
@ -1674,4 +1751,33 @@ extension MP_NetWorkManager {
return decodedString
}
}
//MARK: -
///
class MP_CustomRetrier: RequestInterceptor {
//
private let maximumRetryCount = 3
//
private var retryCounts: [String: Int] = [:]
func retry(_ request: Alamofire.Request, for session: Alamofire.Session, dueTo error: any Error, completion: @escaping (Alamofire.RetryResult) -> Void) {
// id
let requestID = request.id
let currentRetryCount = retryCounts[requestID.uuidString] ?? 0
//
if currentRetryCount < maximumRetryCount, let response = request.task?.response as? HTTPURLResponse, response.statusCode == 503 {
//
retryCounts[requestID.uuidString] = currentRetryCount + 1
// 1
completion(.retryWithDelay(1))
print("请求\(requestID.uuidString)执行重复请求")
} else {
//
retryCounts[requestID.uuidString] = nil
completion(.doNotRetry)
}
}
//
func requestDidFinish(_ request: Request) {
let requestID = request.id
retryCounts[requestID.uuidString] = nil
}
}

View File

@ -406,6 +406,8 @@ class MP_PlayerManager:NSObject{
@objc private func userSwitchCurrentVideoAction(_ sender:Notification) {
//
playState = .Null
//
player.pause()
//
if let video = sender.object as? MPPositive_SongViewModel {
//KVO

View File

@ -57,6 +57,8 @@ class MP_WebWork:NSObject {
//base.js
self.jsPath = self.jsPath + matchedString
print("Current base.JavaScript path:\(self.jsPath)")
//
MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists()
//
if let baseUrl = URL(string: self.jsPath) {
let request = URLRequest(url: baseUrl)

View File

@ -8,6 +8,7 @@
import UIKit
///bload
class MPPositive_BrowseLoadViewModel: NSObject {
static let shared = MPPositive_BrowseLoadViewModel()
///()
var browseModuleLists:[MPPositive_BrowseModuleListViewModel] = []
override init() {

View File

@ -34,14 +34,11 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController{
return tableView
}()
private let MPPositive_HomeShowTableViewCellID = "MPPositive_HomeShowTableViewCell"
private var loadViewModel:MPPositive_BrowseLoadViewModel!
// private var loadViewModel:MPPositive_BrowseLoadViewModel!
override func viewDidLoad() {
super.viewDidLoad()
setTitle("Musicoo")
confirgue()
loadViewModel = MPPositive_BrowseLoadViewModel()
//
loadViewModel.reloadBrowseLists()
NotificationCenter.notificationKey.add(observer: self, selector: #selector(reloadAction(_ :)), notificationName: .positive_browses_reload)
}
deinit {
@ -85,14 +82,14 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController{
//MARK: - tableView
extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return loadViewModel.browseModuleLists.count
return MPPositive_BrowseLoadViewModel.shared.browseModuleLists.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeShowTableViewCellID, for: indexPath) as! MPPositive_HomeShowTableViewCell
cell.browseViewModel = loadViewModel.browseModuleLists[indexPath.section]
cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.section]
cell.showType = .init(rawValue: (indexPath.section > 4 ? 4:indexPath.section))!
cell.requestNextBlock = {
[weak self] (item) in
@ -107,7 +104,6 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "")
lodaViewModel.improveData(item.browseItem.videoId ?? "")
MP_PlayerManager.shared.loadPlayer = lodaViewModel
//
NotificationCenter.notificationKey.post(notificationName: .pup_player_vc)
}
case .list:
@ -122,7 +118,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
[weak self] in
guard let self = self else {return}
let moreVC = MPPositive_MoreContentViewController()
moreVC.browseModuleList = loadViewModel.browseModuleLists[indexPath.section]
moreVC.browseModuleList = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.section]
navigationController?.pushViewController(moreVC, animated: true)
}
return cell

View File

@ -307,9 +307,9 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
coverView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.subtitle
lyricsView.titleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.title
lyricsView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.subtitle
lyricsView.lyricsLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo.lyrics ?? "No Lyrics"
lyricsView.lyricsLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.lyrics ?? "No Lyrics"
coverView.loadBtn.isSelected = MP_PlayerManager.shared.loadPlayer.currentVideo?.isDlownd ?? false
coverView.collectionSongBtn.isSelected = MP_PlayerManager.shared.loadPlayer.currentVideo.isCollection ?? false
coverView.collectionSongBtn.isSelected = MP_PlayerManager.shared.loadPlayer.currentVideo?.isCollection ?? false
}
//MARK: -
//