160 lines
5.1 KiB
Swift
160 lines
5.1 KiB
Swift
//
|
||
// 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)
|
||
}
|
||
|
||
}
|