HipstuCAU / nyam_nyam

오늘 먹을 메뉴를 고민하고 있는 학우들을 위해 만들었습니다.
2 stars 0 forks source link

Setting의 변경사항이 돌아갈 때 Home에 적용되도록 하였습니다. #80

Closed feldblume5263 closed 1 year ago

feldblume5263 commented 1 year ago

close #78



1. UserDefaults 값의 변경사항을 추적합니다

다음과 같이 변경 사항을 추적해서, viewModel에서 사용하는 선택된 campus, cafeteria list들을 최신화 시켜주었습니다.

        NotificationCenter.default.addObserver(self, selector: #selector(handleCampusChanged), name: UserDefaults.didChangeNotification, object: UserDefaults.standard)

        NotificationCenter.default.addObserver(self, selector: #selector(handleSeoulCafeteriaChanged), name: UserDefaults.didChangeNotification, object: UserDefaults.standard)

        NotificationCenter.default.addObserver(self, selector: #selector(handleAnsungCafeteriaChanged), name: UserDefaults.didChangeNotification, object: UserDefaults.standard)

    }

    @objc func handleCampusChanged() {
        self.currentCampus = Observable(Campus(rawValue: UserDefaults.standard.campus) ?? .seoul)
    }

    @objc func handleSeoulCafeteriaChanged() {
        self.seoulCafeteriaList = UserDefaults.standard.seoulCafeteria.map {
            guard let cafeteria = Cafeteria(rawValue: $0) else { fatalError() }
            return cafeteria
        }
    }

    @objc func handleAnsungCafeteriaChanged() {
        self.ansungCafeteriaList = UserDefaults.standard.ansungCafeteria.map {
            guard let cafeteria = Cafeteria(rawValue: $0) else { fatalError() }
            return cafeteria
        }
    }



2. 해당 모듈을 다시 그려줍니다.

옵션을 고르는 모듈을 다시 그려줍니다.

변경된 부분을 조정하기 위해, 기존의 컴포넌트들을 remove 한 후, 다시 그려줍니다. 다음은 다시 그리기 위해 필요한 작업들을 넣어 놓은 resetModule() 코드입니다.

    public func resetModule() {
        viewModel.indexOfDate.value = 0
        viewModel.indexOfCafeteria.value = 0

        viewModel.currentCampus.remove(observer: self)

        campusSelectView.removeFromSuperview()
        dateSelectView.removeFromSuperview()
        cafeteriaSelectView.removeFromSuperview()

        campusSelectView = CampusSelectView()
        dateSelectView = DateSelectView(dateList: viewModel.dateList)
        cafeteriaSelectView = CafeteriaSelectView(viewModel: viewModel)

        setCampusSelectViewLayout()
        setDateSelectViewLayout()
        setCafeteriaSelectViewLayout()

        campusSelectView.delegate = self
        dateSelectView.delegate = self
        cafeteriaSelectView.cafeteriaDelegate = self

        setCampusLabelText()

        viewModel.currentCampus.observe(on: self) { [weak self] _ in
            self?.setCampusLabelText()
            self?.resetCafeteriaView()
            self?.initOptionIndex()
        }

        let index = viewModel.indexOfCafeteria.value
        cafeteriaSelectView.setScrollOffsetBy(buttonIndex: index)
        cafeteriaSelectView.buttons.forEach {
            if $0.buttonIndex == index { $0.isSelected() }
            else { $0.isNotSelected() }
        }
    }



3. 리팩토링이 필요한 부분

현재 resetModule이 viewWillAppear에 들어가 있어, 실제로 값이 바뀌지 않더라도 홈으로 돌아오면 무조건 다시 그리게 됩니다.

이 부분은 오버헤드가 크진 않지만 추후 수정이 필요합니다.

또한 마찬가지로 단순하게 viewWillAppear에 들어가 있기 떄문에 앱이 시작했을 때, 무조건 다시 그리게 되는데 (viewDidLoad에도 있으므로)

viewWillAppear가 viewDidLoad 이후이지만 사실 view가 그려지기 전에 실행되기 때문에 오버헤드는 없지만, 그래도 설정이 바뀌었을 때만 새로 그려지도록 수정이 필요해 보입니다.

해당 리팩토링 요구사항은 #81 issue에 올려놓았습니다.



feldblume5263 commented 1 year ago

미리 구현해둔 Observable를 사용하지 않고 NotificationCenter를 따로 사용하신 이유가 궁금합니다 ..!

Observable에 Usedefaults를 추적하는 기능까지 달 시간적 여유가 없어서 일단 NotificationCenter로 사용할 수 있는 UserDefaults 값 변경 추적 기능을 사용하였습니다. 이는 추후에 리팩토링 할 때 didSet 대신 해당 기능을 사용해서 observable에 추가하겠습니다.

TaekH commented 1 year ago

미리 구현해둔 Observable를 사용하지 않고 NotificationCenter를 따로 사용하신 이유가 궁금합니다 ..!

Observable에 Usedefaults를 추적하는 기능까지 달 시간적 여유가 없어서 일단 NotificationCenter로 사용할 수 있는 UserDefaults 값 변경 추적 기능을 사용하였습니다. 이는 추후에 리팩토링 할 때 didSet 대신 해당 기능을 사용해서 observable에 추가하겠습니다.

넵 확인했습니다 !!