VesselWheel

뷰 계층에서 lazy 키워드 사용하기 본문

Xcode Study

뷰 계층에서 lazy 키워드 사용하기

JasonYang 2024. 2. 2. 14:32

lazy 키워드를 사용하는 이유는?

lazy 키워드를 사용하는 주요 이유는 성능 최적화와 초기화 시점의 제어입니다.

  1. 성능 최적화: lazy 키워드를 사용하면 해당 프로퍼티의 초기화를 미룰 수 있습니다. 이는 메모리를 효율적으로 사용하는 데 도움이 됩니다. 예를 들어, 무거운 계산이나 복잡한 구성이 필요한 객체의 경우, 실제로 필요한 시점에 초기화를 하면서 메모리 사용을 최적화할 수 있습니다.
  2. 초기화 시점 제어: 클래스의 다른 프로퍼티들이 모두 초기화된 후에 특정 프로퍼티를 초기화하고 싶을 때 lazy 키워드를 사용합니다. 이를 통해 다른 프로퍼티들의 최초 값들을 참조해서 초기화를 할 수 있습니다.

그래서 이 코드에서 lazy 키워드를 사용하면 collectionView가 실제로 필요한 시점에 초기화를 하게 됩니다.

이를 통해 메모리를 효율적으로 사용하고, 필요에 따라 count 값에 따른 초기화를 할 수 있습니다.

//
//  MiddleView.swift
//  Instagram
//
//  Created by Jason Yang on 1/30/24.
//

protocol MiddleViewDelegate: AnyObject {
    func didTappedCollectionViewCell()
}

import UIKit

class MiddleView: UIView, UICollectionViewDelegate {
    //    weak var delegate: MiddleViewDelegate?
    weak var middleViewdelegate: MiddleViewDelegate?
    
    // MARK: - UI Properties
    var dataSource: [CollectionModel] = []
    var collectionViewImages: [CollectionModel] = [
        CollectionModel(id: 0, name: "image0", imageName: "picture 0"),
        CollectionModel(id: 1, name: "image1", imageName: "picture 1"),
        CollectionModel(id: 2, name: "image2", imageName: "picture 2"),
        CollectionModel(id: 3, name: "image3", imageName: "picture 3"),
        CollectionModel(id: 4, name: "image4", imageName: "picture 4"),
        CollectionModel(id: 5, name: "image5", imageName: "picture 5"),
        CollectionModel(id: 6, name: "image6", imageName: "picture 6"),
        CollectionModel(id: 7, name: "image7", imageName: "picture 7"),
        CollectionModel(id: 8, name: "image0", imageName: "picture 0"),
        CollectionModel(id: 9, name: "image1", imageName: "picture 1"),
        CollectionModel(id: 10, name: "image2", imageName: "picture 2"),
        CollectionModel(id: 11, name: "image3", imageName: "picture 3"),
        CollectionModel(id: 12, name: "image4", imageName: "picture 4"),
        CollectionModel(id: 13, name: "image5", imageName: "picture 5"),
        CollectionModel(id: 14, name: "image6", imageName: "picture 6"),
        CollectionModel(id: 15, name: "image7", imageName: "picture 7")
    ]
    
    private lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
            layout.scrollDirection = .horizontal  // 스크롤 방향을 수평으로 설정
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(MiddleCollectionViewCell.self, forCellWithReuseIdentifier: MiddleCollectionViewCell.identifier)
        collectionView.backgroundColor = .white
        collectionView.isScrollEnabled = true
        
        return collectionView
    }()
    
    // MARK: - Life Cycle
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        dataSource = collectionViewImages
        collectionView.reloadData()
        setUI()

    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

extension MiddleView {
    private func setUI() {
        backgroundColor = .white
        
        addSubview(collectionView)
        
        heightAnchor.constraint(equalToConstant: 380).isActive = true
        widthAnchor.constraint(equalToConstant: 425).isActive = true
        
        NSLayoutConstraint.activate([
            
            collectionView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            collectionView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            collectionView.topAnchor.constraint(equalTo: self.topAnchor),
            collectionView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
        ])
    }
}


// MARK: - UICollectionViewDataSource
extension MiddleView: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataSource.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MiddleCollectionViewCell.identifier, for: indexPath) as? MiddleCollectionViewCell else {
            return UICollectionViewCell()
        }
        
        let collectionImage = dataSource[indexPath.row]
        cell.configure(with: collectionImage)
        return cell
    }
}

// MARK: - UICollectionViewDelegateFlowLayout
extension MiddleView: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 124, height: 124)
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }
    
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }
    
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }
    
}