58: SwiftData, part 2

그루두·2024년 7월 4일
0

100 days of SwiftUI

목록 보기
66/108

100 days of swiftui: 58

임의로 query를 filter, sort하기

User를 filter하여 특정 사용자만 보이게 하거나, sort하여 순서를 조정하여 보여줄 수도 있다.

먼저 UsersView를 만들어 List에서 user들을 나열한다. 그리고 users는 initializer를 통해 정의한다.

    init(minimumJoinDate: Date) {
        _users = Query(filter: #Predicate<User> { user in
            user.joinDate >= minimumJoinDate
        }, sort: \User.name)
    }

깃헙 링크

users를 filter하여 특정 사용자만 보이게 하기

모두를 보이게 하거나, 앞으로 가입할 사용자를 보이게 하기 위해
1. isShowingUpcoming 변수를 만들어 ContentView의 toolbar에 버튼을 만들어 선택하게 한다.
2. 그리고 UsersView를 불러올 때 joinDate 인수를 isShowingUpcoming에 따라 달리 설정한다.

            UsersView(minimumJoinDate: isShowingUpcoming ? .now : .distantPast)

깃헙 링크

users를 sort하여 순서를 변경하기

추가로 users를 sort하려면,
1. 마찬가지로 ContentView에서 SortDescriptor의 배열인 변수 sortOrder를 만든다.
2. toolbar의 Picker로 선택하는 것에 따라 User의 name 혹은 joinDate를 우선시하여 sortOrder 업데이트 한다.
3. UsersView의 initializer에 sortOrder라는 매개변수를 추가하고, UsersView를 불러올 때 sortOrder를 인수로 전달한다.

    init(minimumJoinDate: Date, sortOrder: [SortDescriptor<User>]) {
        _users = Query(filter: #Predicate<User> { user in
            user.joinDate >= minimumJoinDate
        }, sort: sortOrder)
    }
}

깃헙 링크

다른 model과 연결하기

사용자의 직업 정보를 저장할 수 있는 model Job을 만들었다.

@Model
class Job {
    var name: String
    var priority: Int
    var owner: User?
    
    init(name: String, priority: Int, owner: User? = nil) {
        self.name = name
        self.priority = priority
        self.owner = nil
    }
}

그리고 User는 Job의 배열 jobs를 가진다.

@Model
class User {
    var name: String
    var city: String
    var joinDate: Date
    var jobs = [Job]()
    
    init(name: String, city: String, joinDate: Date) {
        self.name = name
        self.city = city
        self.joinDate = joinDate
    }
}

Job이라는 인스턴스를 만들고, User에 추가해서 이 두 model을 연결하고, User가 삭제될 때 만들어진 Job이라는 인스턴스도 사라지게 하려면 User class를 아래처럼 설정하면 된다.

@Relationship(deleteRule: .cascade) var jobs = [Job]()

그저 User의 인스턴스에 Job 인스턴스를 추가하는 것으로도 두 model을 연결할 수 있다. SwiftData는 User의 인스턴스를 지운다고 해서 연관된 Job 인스턴스를 자동적으로 지우지 않는다.

func addSample() {
    let user1 = User(name: "Piper Chapman", city: "New York", joinDate: .now)
    let job1 = Job(name: "Organize sock drawer", priority: 3)
    let job2 = Job(name: "Make plans with Alex", priority: 4)

    modelContext.insert(user1)

    user1.jobs.append(job1)
    user1.jobs.append(job2)
}

깃헙 링크

icloud 연결

Adding capabilities to your app
Configuring iCloud services

공식 문서대로 Project > Target > Signing & Capabilities > + Capability에서 icloud를 추가하면 된다.

❗️Cloudkit을 이용하려면 애플 개발자 계정이 필요하다.

추가로 icloud에서 데이터가 변경될 때 알림을 전송할 수 있도록 Background mode도 같은 방법으로 추가한다.

마지막으로 icloud에 저장하는 SwiftData는 모든 속성의 초기값을 설정하거나 optional이어야 한다.

깃헙 링크

이렇게 하면 기존 코드 변경 없이 icloud와 동기화할 수 있다.

profile
계속 해보자

0개의 댓글

관련 채용 정보