생성일: 2022년 1월 18일 오후 10:21
class ProfileController: UICollectionViewController {
//MARK: - Properties
var user: User? {
// reloadeData()를 해줘야 user 객체가 생성된 뒤에 콜랙션뷰가 갱신되서 유저 정보가 화면에 나오게 된다.
didSet { collectionView.reloadData() }
}
//MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
configureCollectionView()
fetchUser()
}
//MARK: - API
func fetchUser() {
UserService.fetchUser { user in
self.user = user
self.navigationItem.title = user.username
}
}
... 중략 ...
// 커스텀 헤더를 사용하기 위해 필요한 함수
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerIdentifier, for: indexPath) as! ProfileHeader
// 처음 이 함수가 호출 되었을 때는 user객체가 생성되기 전이기 때문에 안전하게 if let으로 unwrapping 해야 한다. (collectionView.reloadData()가 실행되면 이 함수가 다시 실행되고 그때는 user 객체가 생성된 후이다.)
if let user = user {
header.viewModel = ProfileHeaderViewModel(user: user)
}
return header
}
}
import Firebase
// 현재 사용중인 유저 정보 가져오기
struct UserService {
static func fetchUser(completion: @escaping(User) -> Void) {
guard let uid = Auth.auth().currentUser?.uid else { return }
COLLECTION_USERS.document(uid).getDocument { snapshot, error in
guard let dictionary = snapshot?.data() else { return }
let user = User(dictionary: dictionary)
completion(user)
}
}
}
import Foundation
struct User {
let email: String
let fullname: String
let profileImage: String
let username: String
let uid: String
init(dictionary: [String: Any]) {
self.email = dictionary["email"] as? String ?? ""
self.fullname = dictionary["fullname"] as? String ?? ""
self.profileImage = dictionary["profileImageUrl"] as? String ?? ""
self.username = dictionary["username"] as? String ?? ""
self.uid = dictionary["uid"] as? String ?? ""
}
}
import Foundation
struct ProfileHeaderViewModel {
let user: User
var fullname: String {
return user.fullname
}
var profileImageUrl: URL? {
return URL(string: user.profileImage)
}
init(user: User) {
self.user = user
}
}
import UIKit
import SDWebImage
class ProfileHeader: UICollectionReusableView {
//MARK: - Properties
var viewModel: ProfileHeaderViewModel? {
didSet { configure() }
}
... 중략 ...
func configure() {
guard let viewModel = viewModel else { return }
nameLabel.text = viewModel.fullname
ProfileImageView.sd_setImage(with: viewModel.profileImageUrl)
}
}