Open HJLEE-22 opened 1 year ago
CitiesViewController를 어떻게 더 가볍게 할 수 있을까?
viewModel은 어떻게 초기화해서 사용해야 하나?
cell의 버튼 toggle 작동 안함
해결방법1 :
CoreDataManager에서 데이터 업데이트하는 식에 문제 발견
// 문제1: 단서로 사용하는 데이터의 하위값을 구분하지 않고 통째로 넘김(그냥 실수)
guard let cityData = newLocationGridData.city,
let districtData = newLocationGridData.district else { return }
// 임시저장소 있는지 확인
if let context = context {
// 요청서
let request = NSFetchRequest<NSManagedObject>(entityName: self.modelName)
// 단서 / 찾기 위한 조건 설정
// 문제2: NSPredicate 문법 오류. 두 개의 조건을 걸고 데이터를 표기할 때 그냥 콤마로 연결 가능.
request.predicate = NSPredicate(format: "city = %@ AND district = %@", cityData, districtData)
그래도 여전히 북마크 토글은 제대로 표시 안됨.
viewModel은 어떻게 초기화해서 사용해야 하나?
var cities: [LocationGridData] = []
func updateLocationGridsByBookmark() {
cities = getLocationGrid().filter({ $0.bookmark == true })
}
func getLocationGrid() -> [LocationGridData] {
CoreDataManager.shared.getLocationGridList()
}
func getWeatherDataDependingText(searchBar: UISearchBar) {
if searchBar.text!.isEmpty {
cities = getLocationGrid()
} else {
guard let searchBarText = searchBar.text else { return }
cities = getLocationGrid().filter({ $0.city!.contains(searchBarText) || $0.district!.contains(searchBarText) })
}
}
// MARK: - Lifecycle
init() {
self.bindLocationGridData()
}
// MARK: - Helpers for data
func bindLocationGridData() {
locationGridDatas = getBookmarkedLocationGridForViewModel()
}
func updateLocationGridsBookmark(_ locationGridData: LocationGridData) {
CoreDataManager.shared.updateLocationGridData(newLocationGridData: locationGridData) { [weak self] in
}
}
//...
func getBookmarkedLocationGridForViewModel() -> [LocationGridData] {
CoreDataManager.shared.getBookmarkedLocationGridList()
}
func getFilteredLocationGrid(by locationName: String) {
self.locationGridDatas = CoreDataManager.shared.getFilteredLocationGridList(by: locationName)
}
cell의 버튼 toggle 작동 안함
extension CitiesViewController: CellButtonActionDelegate {
func bookmarkButtonTapped(_ name: String) {
cities.forEach { data in
if data.district != "" {
if let index = getLocationGrid().firstIndex(where: { $0.district == name }) {
print("DEBUG: index touched \(index)")
cities[index].bookmark.toggle()
CoreDataManager.shared.updateLocationGridData(newLocationGridData: cities[index]) {
DispatchQueue.main.async {[weak self] in
guard let self = self else { return }
self.cityListForSearchTableView.reloadData()
self.bookmarkCitiesTableView.reloadData()
}
변경 코드 :
// cell 파일
lazy var bookmarkButton: TouchableOpacityImageView = {
let button = TouchableOpacityImageView(frame: .zero)
button.image = UIImage(systemName: "star")
return button
}()
// VC 파일
// cellForRowAt에서
cell.bookmarkButton.setOpaqueTapGestureRecognizer { [weak self] in
self?.viewModel.updateLocationGridsBookmark(model)
}
해결하고자 하는 주제에 대해 설명 해 주세요.
다음 작업들이 진행되어야 합니다.
참고 사항
추후 작성