써니쿠키의 IOS 개발일기

[swift] singleton 쉬운 예제 구현해보기 본문

swift, Ios

[swift] singleton 쉬운 예제 구현해보기

sunnyCookie 2022. 9. 12. 22:19

Singleton Pattern을 복습하기 위해 간단한 예제를 만들어보았다.
화면 전환 시 View Life Cycle과 관련된 메서드도 이용되었다.


 

 

 

 

 

(전체 코드는 제일 하단에)

 

싱글톤을 이용해서 두 VC에서 같은 value를 공유하도록 하였다.
버튼 재고추가페이지로 이동클릭 후 모달 화면에서 +10 버튼을 클릭하면
stock이 10씩 추가되도록 하였다.

 

 

 

 

 

 

 


1.  싱글턴 패턴 이용

싱글턴 패턴을 활용해 두 View Controller 가 하나의 정보를 공유하도록 하기

 

1. PointManager 클래스를 싱글턴으로 만들기

  • class 내부에 private init()을 구현하고 static을 이용해 타입프로퍼티인 sharedStockManager에 인스턴스화 해 놓으면 sharedStockManager 외에는 더 이상 StockManager를 만들 수 없다. 단 한개의 인스턴스인 것
class StockManager {
	var stock: Int = 0
	static var sharedStockManager = StockManager()
	private init(){}
}

 

2. 싱글턴으로 만든 PointManager의 프로퍼티인 point 접근방법

  • 단 하나의 인스턴스인 sharedStockManager 를 통해 접근한다.
let stock = StockManager.sharedStockManager.stock

 

(추가내용)

2.   viewLifeCylMethod 사용하기

  • stock 에서 10씩 추가되면서 변하는 순간의 변화를 보여주기 위해 viewDidAppear() 사용하기
  • viewWillAppear 사용 시: 모달 화면 꺼질 시 10이 추가된 값이 바로 보임.
  • viewDidAppear 사용 시: 모달 화면 꺼질 시 0 -> 10 같이 추가되는 변화가 보임
override func viewDidAppear(_ animated: Bool) {
	super.viewDidAppear(animated) 
    updateStockLabel() 
} 

func updateStockLabel() { 
	stockLabel.text = String(StockManager.sharedStockManager.stock) 
}

전체코드

1. MainViewController

//싱글톤이 적용된 StockManager Class
class StockManager {
    var stock: Int = 0
    static var sharedStockManager = StockManager()

    private init(){ } 
}

class MainViewController: UIViewController {
    @IBOutlet weak var stockLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        updateStockLabel()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        updateStockLabel()
    }

    func updateStockLabel() {
        stockLabel.text = String(StockManager.sharedStockManager.stock)
    }

    @IBAction func touchUpPresentStockChangePage(_ sender: UIButton) {
        guard let stockChangePage = storyboard?.instantiateViewController(withIdentifier: "stockChangePage") as? BuyingViewController  else { return }

        stockChangePage.modalPresentationStyle = UIModalPresentationStyle.fullScreen
        self.present(stockChangePage, animated: true)
    }
}

 

2. stockChangeViewController

class BuyingViewController: UIViewController {
    @IBAction func touchUpAddTenButton(_ sender: UIButton) {
        StockManager.sharedStockManager.stock += 10
        dismiss(animated: true)
    }
}
반응형
Comments