Docs Menu
Docs Home
/ /
Atlas Device SDK

퀵 스타트 - Swift SDK

이 페이지의 내용

  • Realm 가져오기
  • 객체 모델 정의
  • Realm 열기
  • 객체 만들기, 읽기, 업데이트 및 삭제
  • 변화를 주시하세요
  • Device Sync 추가(선택 사항)
  • 전제 조건
  • 앱 초기화
  • 사용자 인증
  • Realm 열기

이 퀵스타트에서는 Realm Swift SDK로 Realm을 사용하는 방법을 설명합니다. 시작하기 전에 Swift SDK를 설치했는지 확인하세요.

다음도 참조하세요.

앱에서 SwiftUI를 사용하는 경우 SwiftUI 빠른 시작을 확인하세요.

Realm을 사용하는 모든 Swift 파일의 맨 위에 다음 가져오기 문을 추가합니다:

import RealmSwift

로컬 전용 영역의 경우 코드에서 직접 객체 모델을 정의할 수 있습니다. 이 빠른 시작에서는 선택 사항인 Device Sync를 추가하지 않는 한 ownerId 을 제거할 수 있습니다.

class Todo: Object {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var name: String = ""
@Persisted var status: String = ""
@Persisted var ownerId: String
convenience init(name: String, ownerId: String) {
self.init()
self.name = name
self.ownerId = ownerId
}
}

로컬 전용 영역에서 영역을 여는 가장 간단한 메서드는 구성 매개 변수가 없는 기본 영역을 사용하는 것입니다.

// 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()

여러 기기에서 Realm 데이터를 동기화하려면 Atlas App Services App을 설정하고 Device Sync를 활성화하면 됩니다. App Services로 수행할 수 있는 작업에 대한 자세한 내용은 다음을 참조하세요: App Services - Swift SDK

Realm 데이터를 동기화하려면 먼저 다음을 수행해야 합니다.

인증 및 동기화와 같은 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

장치 동기화를 활성화하고 사용자를 인증한 후에는 구성 객체를 만들고 영역을 열 수 있습니다. 그런 다음 영역에서 읽고 쓸 수 있는 데이터를 결정하는 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.
@MainActor
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)에는 성능이 소모됩니다. 세션 중에 영역 객체를 여러 번 업데이트해야 하는 경우 모든 변경이 완료될 때까지 편집한 객체를 메모리에 보관하는 것이 좋습니다. 이렇게 하면 모든 변경 사항 대신 완전하고 업데이트된 객체만 영역에 기록하므로 동기화 성능이 향상됩니다.

다음

Atlas Device SDK Docs에 오신 것을 환영합니다