[TIL] WishListApp 과제 - NumberFormatter(), refreshControl, Core Data 사용하기

신승현·2024년 4월 17일

TIL

목록 보기
60/72
post-thumbnail

1️⃣ NumberFormatter() 사용하기

NumberFomatter()는 price에 1000단위로 (,)를 추가하기 위해서 사용한 기능이다.
Swift에서 숫자를 형식화하여 문자열로 변환할 때 NumberFormatter 클래스를 사용할 수 있다고 한다.

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
if let formattedPrice = formatter.string(from: NSNumber(value: wishData.getPrice())) {
	uiPriceLabel.text = "\(formattedPrice) $"
} else {
	uiPriceLabel.text = "\(wishData.getPrice()) $"
}

2️⃣ refreshControl 사용하기

당겨서 새로고침하는 기능은 어플을 사용하면서 많이 경험해봤다.
refreshControl은 그 기능을 추가할 수 있다.
원래는 변수를 새로 할당해서 추가하는게 일반적이지만, 아래의 코드는 UITableViewController에서 작성이 되었기 때문에 자체적으로 가지고 있는 refreshControl?을 언래핑해서 사용하게 되었다.

// ....생략....
func setTableView() {
	tableView.dataSource = self
	tableView.delegate = self
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        
    if let refreshControl = tableView.refreshControl {
    	refreshControl.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged)
        refreshControl.attributedTitle = NSAttributedString(string: "당겨서 새로고침")
    } else {
        let newRefreshControl = UIRefreshControl()
        newRefreshControl.addTarget(self, action: #selector(refreshData(_:)), for: .valueChanged)
        newRefreshControl.attributedTitle = NSAttributedString(string: "당겨서 새로고침")
        tableView.refreshControl = newRefreshControl
	}
}
// ....생략....
@objc func refreshData(_ sender: UIRefreshControl) {
	self.wishListDatas = self.wishListDataManager.readData()
	self.tableView.reloadData()
	refreshControl?.endRefreshing()
}

3️⃣ Core Data - Create, Read, Delete 하기

Core Data는 원하는 데이터를 어플 내부에 저장할 수 있기 때문에 프레임워크를 import하는 것부터 시작해서 Entity 생성과 Attribute 추가 그리고 아래의 코드를 작성해서 데이터를 다룰 수 있다.

class WishListDataManager {
    
    var persistentContainer: NSPersistentContainer? {
        (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
    }
    
    func createData(wishData: WishData) {
        guard let viewContext = self.persistentContainer?.viewContext else {
            print("Error: Can't access Core Data view context")
            return
        }

        let newWishData = WishListData(context: viewContext)

        newWishData.id = wishData.getId()
        newWishData.name = wishData.getName()
        newWishData.descriptions = wishData.getDescriptions()
        newWishData.price = wishData.getPrice()
        newWishData.thumbnail = wishData.getThumbnail()

        do {
            try viewContext.save()
            print("Data saved successfully")
        } catch {
            print("Failed to save data: \(error.localizedDescription)")
        }
    }

    
    func readData() -> [WishListData] {
        guard let viewContext = self.persistentContainer?.viewContext else {
            print("Error: Can't access Core Data view context")
            return []
        }
        
        let request = WishListData.fetchRequest()
        
        do {
            let wishListDatas = try viewContext.fetch(request)
            return wishListDatas
        } catch {
            print("Error fetching data from CoreData: \(error.localizedDescription)")
            return []
        }
    }
    
    func deleteData(at index: Int) {
        guard let viewContext = self.persistentContainer?.viewContext else {
            print("Error: Can't access Core Data view context")
            return
        }
        
        let request = WishListData.fetchRequest()
        
        do {
            let wishListDatas = try viewContext.fetch(request)
            // 인덱스 유효성 검사
            guard wishListDatas.indices.contains(index) else {
                print("Error: Index out of range")
                return
            }
            // 인덱스에 해당하는 데이터 삭제
            let dataToDelete = wishListDatas[index]
            viewContext.delete(dataToDelete)
            
            // 변경 사항 저장
            try viewContext.save()
            print("Data deleted successfully")
        } catch {
            print("Failed to delete data: \(error.localizedDescription)")
        }
    }
}

4️⃣ 마무리

이번 주에 진행한 과제에서 URL Session과 Core Data, NumberFomatter() 그리고 refreshControl 같은 기능들을 처음 사용했다. 확실히 처음 사용하는 기능들은 많은 오류를 겪어가면서 개발이 되는것 같다.
그렇다고 해서 기존에 사용했던 기능들도 오류가 안났던 건 아니였다..
이게 새로운 기능들을 배울 때마다 기존에 사용했던 기능들을 하나씩 잊어가는 느낌이다.. 결국에는 프로젝트를 많이 만들면서 많이 사용해봐야 머리보다는 손에 익어서 자연스럽게 사용할 수 있을 것 같다.

profile
개발자

0개의 댓글