// // ProfileViewModel.swift // IOS_study // // Created by CC-star on 2025/7/15. // import PhotosUI import SwiftUI @Observable final class ProfileViewModel { var viewDidLoad = false //user var user = DBUser() var userID: String { user.id } var draftUser = DBUser() var isFcUser = false var isCompanyImagesLoaded = false var isPostingCompany = false //发布的工作 var plJobs: [PLJob] = [] var aPLJobsCount = 0 var pLJobsCount = 0 var isFcPLJobs = false var shouldRefreshMyPLJobs = false //分页用 var currentPLPage = 0 var isPLFinshed = false //总的 var isFcSome: Bool { isFcUser || isFcPLJobs } @MainActor func getUsersData() async throws { try await getUser() async let getPLJobs: () = getPLJobs(isRefresh: true) async let getPLJobsCount: () = getPLJobsCount() let _ = await (getPLJobs, getPLJobsCount) } @MainActor func refreshIFNeed() async throws { if shouldRefreshMyPLJobs { async let getPLJobs: () = getPLJobs(isRefresh: true) async let getPLJobsCount: () = getPLJobsCount() let _ = await (getPLJobs, getPLJobsCount) shouldRefreshMyPLJobs = false } } var logoUIImage: UIImage?//可选类型,? -> 默认nil var logoImageErrorMsg = "" var logoItem: PhotosPickerItem? { didSet { //guard let logoItem -> guard let logoItem = logoItem guard let logoItem else { return } Task { //把用户选择的item转换成。。。 if let data = try? await logoItem.loadTransferable(type: Data.self), let uiImage = UIImage(data: data) { logoImageErrorMsg = "" logoUIImage = uiImage } else { print("PhotosPickerItem转换成图片失败") logoImageErrorMsg = "上传图片失败,请重新上传" } self.logoItem = nil } } } var isLoadingCompanyImages = false var companyUIImages: [UIImage] = [] var companyUIImagesErrorMsg = "" var companyItems: [PhotosPickerItem] = [] { didSet { if companyItems.isEmpty { return } Task { @MainActor in isLoadingCompanyImages = true defer { isLoadingCompanyImages = false } var newImages: [UIImage] = [] for item in companyItems { if let data = try? await item.loadTransferable(type: Data.self), let uiImage = UIImage(data: data) { newImages.append(uiImage) } } companyUIImages.append(contentsOf: newImages) if newImages.count == companyItems.count { companyUIImagesErrorMsg = "" } else { companyUIImagesErrorMsg = "有图片上传失败,请重新上传" } companyItems.removeAll() } } } @MainActor func loadCompanyLogoAndIamges() async { isCompanyImagesLoaded = false if !user.cLogoURLStr.isEmpty { if let url = URL(string: user.cLogoURLStr), let (data, _) = try? await URLSession.shared.data(from: url), let uiImage = UIImage(data: data) { logoUIImage = uiImage } } if !user.cImageURLStrs.isEmpty { var newImages: [UIImage] = [] for cImageURLStr in user.cImageURLStrs { if let url = URL(string: cImageURLStr), let (data, _) = try? await URLSession.shared.data(from: url), let uiImage = UIImage(data: data) { newImages.append(uiImage) } } companyUIImages = newImages } isCompanyImagesLoaded = true } @MainActor func postCompany() async throws { user = draftUser //处理空格(必填部分) user.cName = user.cName.trimmed user.cCity = user.cCity.trimmed //处理空格(选填部分) if user.cAboutUS.isBlank { user.cAboutUS = "" } else { user.cAboutUS = user.cAboutUS.trimmed } //并行上传图片,两种方法:async let 和 withThrowingTaskGroup async let logoURLStr: String? = {//闭包 guard let logoUIImage else { return nil } return try await StorageManager.shared.saveImage(logoUIImage) }() if !companyUIImages.isEmpty { let companyImageResults = try await withThrowingTaskGroup(of:((Int, String).self)) { group in for (index, uiImage) in companyUIImages.enumerated() { group.addTask { let urlStr = try await StorageManager.shared.saveImage(uiImage) return (index, urlStr) } } var results: [(Int, String)] = [] for try await result in group { results.append(result) } return results } user.cImageURLStrs = companyImageResults.sorted(by: { $0.0 < $1.0 }).map { $0.1 } } if let clogoURLStr = try await logoURLStr { user.cLogoURLStr = clogoURLStr } try await UserManager.shared.update(user: user) } }