스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

37. 스파르타 코딩 클럽 - 포켓몬 연락처 앱 만들기 (4)

seongpil Heo 2025. 4. 22. 18:42

 🧑‍💻 오늘까지 진행한 요구사항

 

이름순으로 정렬되게 하려면

테이블 뷰에 들어가는 배열을 정렬해야 한다.

 

배열을 정렬하는 방법은 생각보다 간단하다.

예를 들어 Person 이라는 구조체를 가진 배열 people가 있다면

struct Person {
    var name: String
    var age: Int
}

var people = [
    Person(name: "마리오", age: 28),
    Person(name: "루이지", age: 27),
    Person(name: "동키콩", age: 26),
    Person(name: "데이지", age: 25)
]

 

이 people 배열을 정렬하는 방법은 sorted 함수를 사용한다

let sortedPeople = people.sorted { $0.name < $1.name }

 

name을 기준으로 오름차순 (가나다순) 정렬된다.

 

let sortedPeople = people.sorted { $0.name.lowercased() < $1.name.lowercased() }

 

위와 같은 코드로 작성하면 대소문자 구분 없이 정렬도 가능하다!


 ✓ TIL

내 코드에서는 아래와 같이 적용하였다.

// CoreData에서 불러온 연락처 배열
var contactsTableData: [ContactsModel] = []


private func sortData() {
        let sortedContactsTableData = contactsTableData.sorted { $0.name < $1.name }
        contactsTableData = sortedContactsTableData
    }

 

배열 정렬을 위한 sortData() 함수를 작성하였다.

sortData 함수에서 contactsTableData를 name을 기준으로 오름차순 정렬을 수행한 뒤

sortedContactsTableData를 다시 contactsTableData에 넣어준다.

 

// 저장된 데이터 읽어오기
    private func readAllData() {
        contactsTableData = []
        do {
            let contactsData = try self.container.viewContext.fetch(Contacts.fetchRequest())
            
            for data in contactsData as [NSManagedObject] {
                if let name = data.value(forKey: Contacts.Key.name) as? String,
                   let phoneNumber = data.value(forKey: Contacts.Key.phoneNumber) as? String,
                   let imageUrl = data.value(forKey: Contacts.Key.imageUrl) as? String{
                    print("name: \(name), phoneNumber: \(phoneNumber), imageUrl: \(imageUrl)")
                    contactsTableData.append(ContactsModel(name: name, phoneNumber: phoneNumber, imageUrl: imageUrl))
                }
            }
            
            sortData()
        } catch {
            print("데이터 읽기 실패")
        }
    }

 

sortData 함수는 CoreData를 불러오는 readAllData 함수에서 실행된다.

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.isHidden = true
        
        // CoreData
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        self.container = appDelegate.persistentContainer
        
        readAllData()
        
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }

 

readAllData 함수는 viewWillAppear 에서 실행되며 ContactsViewController에서 사용자가 연락처 추가를 마친 후 실행되며

tableView.reloadData()는 imageView도 다시 그려주기 때문에 메인 쓰레드에서 작업해야 한다.

 

 📱 Simulator

 

왼쪽은 정렬 전   /   오른쪽은 정렬 후

 

왼쪽 시뮬레이터는 데이터를 추가하면 테이블 뷰의 맨 아래쪽에 데이터가 표시되고,

오른쪽 시뮬레이터는 데이터를 추가하면 이름순에 맞게 오름차순 정렬되어 데이터가 표시된다.