본문 바로가기

개발/Swift

[Swift] CoreData 정렬 기능 추가하기

CoreData로 관리하는 데이터를 정렬하는 버튼을 생성해보겠습니다.

아래 코드 예시 기준

  • View : UITableView 기준
  • trigger : UIButton
  • Data : CoreData / Entity : Item / property(String) : title
  • 한줄설명 : 버튼을 누르면 데이터를 정렬하여 가져오도록 하며, 버튼을 누를 때마다 오름차순, 내림차순이 전환됩니다.
// ViewController.swift

import UIKit
import CoreData // CoreData 모듈 추가

class ViewController: UIViewController {

    // 필요한 객체 초기화 (사용할 뷰, 데이터를 넣을 Array, CoreData Context)
    let tableView = UITableView()

    // 정렬된 데이터가 들어갈 Array (Entity명 Item)
    let itemArray = [Item]()

    //  Button 초기화, 
    lazy var button: UIButton = {
        let button = UIButton(configuration: .filled())
        button.frame.origin = .init(x: view.center.x, y: view.center.y)
        button.frame.size = .init(width: 100, height: 50)
        button.setTitle("정렬하기", for: .normal)
        button.addTarget(self, action: #selector(sortRequest), for: .touchDown)
        return button
  }()

    // 정렬 차순 프로퍼티 (누를때마다 오름차순 / 내림차순 전환용도)
    var isAcending: Bool = false

    // CoreData Context
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext


    // 뷰 로드 전 실행할 메소드 정의 (여기서는 정렬 메소드를 불러와보겠습니다.)
    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(self.tableView)
        view.addSubview(self.button)

    }

    // 정렬 메소드
    @objc func sortRequest(_ sender: UIButton) {

        // 오름차순, 내림차순 토글
        self.isAcending = !self.isAcending

      // 1. 데이터 요청 생성하기.
      let request: NSFetchRequest<Item> = Item.fetchRequest()

      // 2. 기준데이터(key) 설정 및 정렬차순(ascending) 파라미터 지정.
      let sortDescriptor = NSSortDescriptor(key: "title", ascending: self.isAcending)

        // 3. 1에서 요청한 Request에 2에서 설정한 정렬기준 반영
      request.sortDescriptors = [sortDescriptor]

        do {
            itemArray = try context.fetch(request) // 정렬된 요청데이터를 itemArray에 넣기 
        } catch {
            // 데이터 fetch 실패시 리턴되는 부분
            print(data fetch error : \(error.localizedDescription)
        }

        // tableView 리로드하기.
    self.tableView.reloadData()
    }
}

만약 코드가 제대로 작동하지 않거나, 틀린 부분이 있다면 댓글 남겨주시면 수정하도록 하겠습니다.

반응형