퀵 스타트 - Swift SDK
이 페이지의 내용
이 퀵스타트에서는 Realm Swift SDK로 Realm을 사용하는 방법을 설명합니다. 시작하기 전에 Swift SDK를 설치했는지 확인하세요.
Realm 가져오기
Realm을 사용하는 모든 Swift 파일의 맨 위에 다음 가져오기 문을 추가합니다:
import RealmSwift
객체 모델 정의
로컬 전용 영역의 경우 코드에서 직접 객체 모델을 정의할 수 있습니다. 이 빠른 시작에서는 선택 사항인 Device Sync를 추가하지 않는 한 ownerId
을 제거할 수 있습니다.
class Todo: Object { true) var _id: ObjectId (primaryKey: var name: String = "" var status: String = "" var ownerId: String convenience init(name: String, ownerId: String) { self.init() self.name = name self.ownerId = ownerId } }
Realm 열기
로컬 전용 영역에서 영역을 여는 가장 간단한 메서드는 구성 매개 변수가 없는 기본 영역을 사용하는 것입니다.
// Open the local-only default realm let realm = try! Realm()
Realm .Configuration 매개 변수를 지정하여 특정 파일 URL , 인메모리 또는 클래스의 하위 집합에서 영역 을 열 수도 있습니다.
자세한 내용은 Realm 구성 및 열기를 참조하세요.
객체 만들기, 읽기, 업데이트 및 삭제
영역을 열고 나면 쓰기 트랜잭션(write transaction) 블록에서 영역과 해당 객체를 수정할 수 있습니다.
새 to-do 객체를 생성하려면 to-do 클래스를 인스턴스화하고 쓰기 블록의 영역에 추가합니다.
let todo = Todo(name: "Do laundry", ownerId: user.id) try! realm.write { realm.add(todo) }
영역 내 모든 to-do의 라이브 collection을 검색할 수 있습니다.
// Get all todos in the realm let todos = realm.objects(Todo.self)
where를 사용하여 해당 컬렉션을 필터링할 수도 있습니다.
let todosInProgress = todos.where { $0.status == "InProgress" } print("A list of all todos in progress: \(todosInProgress)")
todo를 수정하려면 쓰기 트랜잭션(write transaction) 차단에서 속성을 업데이트합니다.
// All modifications to a realm must happen in a write block. let todoToUpdate = todos[0] try! realm.write { todoToUpdate.status = "InProgress" }
마지막으로 할 일을 삭제할 수 있습니다:
// All modifications to a realm must happen in a write block. let todoToDelete = todos[0] try! realm.write { // Delete the Todo. realm.delete(todoToDelete) }
변화를 주시하세요
observe
메서드를 사용하여 영역, collection 또는 객체의 변경 사항을 모니터링 할 수 있습니다.
// Retain notificationToken as long as you want to observe let notificationToken = todos.observe { (changes) in switch changes { case .initial: break // Results are now populated and can be accessed without blocking the UI case .update(_, let deletions, let insertions, let modifications): // Query results have changed. print("Deleted indices: ", deletions) print("Inserted indices: ", insertions) print("Modified modifications: ", modifications) case .error(let error): // An error occurred while opening the Realm file on the background worker thread fatalError("\(error)") } }
계속해서 관찰하려면 observe
에서 반환된 알림 토큰을 보관해야 합니다. 관찰이 완료되면 토큰을 무효화하여 리소스를 해제합니다.
// Invalidate notification tokens when done observing notificationToken.invalidate()
Device Sync 추가(선택 사항)
여러 기기에서 Realm 데이터를 동기화하려면 Atlas App Services App을 설정하고 Device Sync를 활성화하면 됩니다. App Services로 수행할 수 있는 작업에 대한 자세한 내용은 다음을 참조하세요: App Services - Swift SDK
전제 조건
Realm 데이터를 동기화하려면 먼저 다음을 수행해야 합니다.
으로 토글된 개발 모드 와 섹션의 필드를사용하여 Flexible Sync를 활성화 합니다.
On
ownerId
Queryable Fields
앱 초기화
인증 및 동기화와 같은 App Services 기능을 사용하려면 앱 ID를 사용하여 App Services 앱에 액세스합니다. App Services UI에서 앱 ID 찾기를 수행할 수 있습니다.
let app = App(id: APP_ID) // Replace APP_ID with your Atlas App ID
사용자 인증
이 빠른 시작에서는 익명 인증을 사용하여 사용자가 식별 정보를 제공하지 않고도 로그인할 수 있습니다. 사용자를 인증한 후 해당 사용자에 대한 영역을 열 수 있습니다.
do { let user = try await app.login(credentials: Credentials.anonymous) print("Successfully logged in user: \(user)") await openSyncedRealm(user: user) } catch { print("Error logging in: \(error.localizedDescription)") }
Realm Swift SDK는 사용자를 인증, 등록, 연결할 수 있는 다양한 메서드를 추가로 제공합니다. 다른 인증 제공자에 대해서는 다음을 참조하세요: 사용자 인증 - Swift SDK
Realm 열기
장치 동기화를 활성화하고 사용자를 인증한 후에는 구성 객체를 만들고 영역을 열 수 있습니다. 그런 다음 영역에서 읽고 쓸 수 있는 데이터를 결정하는 Flexible Sync 구독을 추가할 수 있습니다.
영역을 구독하게 되면 이 예제에서 해당 영역을 사용할 수 있는 다른 함수로 영역과 사용자를 전달합니다.
팁
앱이 async/await
컨텍스트에서 Realm에 액세스하는 경우 코드를 @MainActor
(으)로 표시하여 스레드 관련 충돌을 방지합니다.
// Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func openSyncedRealm(user: User) async { do { var config = user.flexibleSyncConfiguration() // Pass object types to the Flexible Sync configuration // as a temporary workaround for not being able to add a // complete schema for a Flexible Sync app. config.objectTypes = [Todo.self] let realm = try await Realm(configuration: config, downloadBeforeOpen: .always) // You must add at least one subscription to read and write from a Flexible Sync realm let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.append( QuerySubscription<Todo> { $0.ownerId == user.id }) } await useRealm(realm: realm, user: user) } catch { print("Error opening realm: \(error.localizedDescription)") } }
동기화된 영역에서 변경 사항을 읽고, 쓰고, 보는 구문은 위의 동기화되지 않은 영역의 구문과 동일합니다. 로컬 데이터로 작업하는 동안 백그라운드 스레드는 변경 세트를 효율적으로 통합, 업로드 및 다운로드합니다.
구독 세트에 대한 모든 쓰기 트랜잭션(write transaction)에는 성능이 소모됩니다. 세션 중에 영역 객체를 여러 번 업데이트해야 하는 경우 모든 변경이 완료될 때까지 편집한 객체를 메모리에 보관하는 것이 좋습니다. 이렇게 하면 모든 변경 사항 대신 완전하고 업데이트된 객체만 영역에 기록하므로 동기화 성능이 향상됩니다.