본문 바로가기
Project/뿌대식: 부산대학교 학식 알리미

뿌대식: 개발 - 북마크, 기본 캠퍼스

by songmoro 2024. 1. 10.
728x90

북마크와 메뉴를 볼 기본 캠퍼스에 대한 데이터를 앱 내에서 저장할 수 있도록 합니다.

 

원래는 Core Data를 사용하려고 했으나, 데이터의 양이 많지 않고 가짓수도 적어서 Core Data 대신 조금 느려도 사용이 간편한 UserDefaults를 사용했습니다.

 

 

<View Model>

func saveDefaultCampus() {
    UserDefaults.standard.setValue(defaultCampus, forKey: "defaultCampus")
}

func saveBookmark() {
    UserDefaults.standard.setValue(bookmark, forKey: "bookmark")
}

func loadDefaultCampus() {
    guard let defaultCampus = UserDefaults.standard.string(forKey: "defaultCampus") else {
        self.defaultCampus = "부산"
        selectedCampus = "부산"
        requestCampusDatabase()
        return
    }
    self.defaultCampus = defaultCampus
    selectedCampus = defaultCampus
    requestCampusDatabase()
}

func loadBookmark() {
    guard let bookmark = UserDefaults.standard.stringArray(forKey: "bookmark") else {
        self.bookmark = []
        return
    }
    self.bookmark = bookmark
}

북마크, 기본 캠퍼스를 저장, 로드 하는 함수입니다.

뷰 모델 내에 위치합니다.

 

 

<View>

var body: some View {
// ...
	.sheet(isPresented: $vm.isSheetShow) {
        Sheet(defaultCampus: $vm.defaultCampus)
            .onChange(of: vm.defaultCampus) { _, newValue in
                vm.saveDefaultCampus()
            }
    }
// ...
}

private var menu: some View {
// ...
    ScrollView {
        if let selectedWeekday = Week(rawValue: vm.selectedDay) {
            ForEach(vm.restaurantByBookmark(), id: \\.rawValue) {
                if let restaurant = vm.menu[selectedWeekday]![$0] {
                    MenuView(bookmark: $vm.bookmark, restaurant: $0.rawValue, meal: restaurant)
                }
            }
            .onChange(of: vm.bookmark) { _, newValue in
                vm.saveBookmark()
            }
        }
    }
// ...
}

뷰 내에서는 onChange를 통해서 뷰 모델의 북마크, 기본 캠퍼스가 변경되면 데이터를 저장하도록 구현했습니다.

 

 

<분류 함수>

func restaurantByBookmark() -> [Restaurant] {
    let bookmarkRestaurant = bookmark.map {
        Restaurant(rawValue: $0)!
    }
    
    let campusRestaurant = Campus(rawValue: selectedCampus)!.restaurant.filter {
        !bookmarkRestaurant.contains($0)
    }
    
    return bookmarkRestaurant + campusRestaurant
}

기존 allCases를 사용해 식당 목록을 보여주던 것을 북마크된 식당을 먼저 보여주기 위해 분류 함수를 추가했습니다.

 

 

<화면 스크린샷>

북마크한 식당이 가장 상위에 위치한 모습입니다.

728x90