Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

앱에 Device Sync 추가 - Swift SDK

이 페이지의 내용

  • 전제 조건
  • 클라이언트 애플리케이션에 Device Sync 추가
  • Atlas App Services 백엔드에 연결
  • 사용자 인증
  • 동기화된 Realm 열기
  • Realm 사용

다음도 참조하세요.

이 페이지에는 앱에 Device Sync를 추가하는 방법에 대한 정보가 포함되어 있습니다. Device Sync 가 무엇이며 어떻게 작동하는지 자세히 알아보려면 Atlas App Services: 데이터 동기화를 참조하세요.

클라이언트 에서 동기화된 영역 에 액세스 하려면 먼저 Atlas App Services UI 에서 동기화 를 활성화 해야 합니다. 이 프로세스 중에 스키마 의 필드와 일치 하는 쿼리 가능 필드 를 정의 해야 합니다. 앱 사용자의 읽기 및 쓰기 (write) 권한도 정의 합니다.

이 예에서 모델에는 Flexible Sync 사용자의 user.id 에 매핑되는 ownerId 필드가 포함되어 있습니다.

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

Atlas App Services UI에서찾을 수 있는 앱의 앱 를 전달합니다.ID

let app = App(id: FLEX_SYNC_APP_ID) // Replace FLEX_SYNC_APP_ID with your Atlas App ID
2

클라이언트 프로젝트에서 사용자를 인증합니다 . 여기서는 익명 인증을 사용합니다.

func login() async throws -> User {
// Authenticate with the instance of the app that points
// to your backend. Here, we're using anonymous login.
let user = try await app.login(credentials: Credentials.anonymous)
print("Successfully logged in user: \(user)")
return user
}
3

Realm을 영역 된 영역 으로 엽니다. 동기화된 영역 이 열기 전에 데이터를 다운로드 할지 여부를 지정할 수 있습니다. 여기서는 Flexible Sync 구성 을 사용하고 SDK가 영역 을 열기 전에 항상 최신 업데이트를 다운로드 하도록 지정합니다. 초기 구독 으로 영역 을 부트스트랩합니다. 또한 이 영역 에 포함할 객체 유형을 지정합니다 .

앱이 async/await 컨텍스트에서 Realm에 액세스하는 경우 코드를 @MainActor(으)로 표시하여 스레드 관련 충돌을 방지합니다.

@MainActor
func openSyncedRealm(user: User) async {
do {
var config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in
subs.append(
QuerySubscription<Todo> {
$0.ownerId == user.id
})
})
// 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)
useRealm(realm, user)
} catch {
print("Error opening realm: \(error.localizedDescription)")
}
}

동기화된 Realm에서 변경 사항을 읽고, 쓰고, 감시 하는 구문은 동기화되지 않은 Realm의 구문과 동일합니다. 로컬 데이터로 작업하는 동안 백그라운드 스레드는 변경 세트를 효율적으로 통합, 업로드 및 다운로드합니다.

다음 코드는 새 Task 객체를 만들어 Realm에 씁니다.

@MainActor
func useRealm(_ realm: Realm, _ user: User) {
// Add some tasks
let todo = Todo(name: "Do laundry", ownerId: user.id)
try! realm.write {
realm.add(todo)
}
}

중요

동기화를 사용할 때 메인 스레드에서 쓰기 방지

Realm이 백그라운드 스레드에서 동기화 통합을 수행한다는 사실은 메인 스레드에서 Realm에 쓰는 경우 백그라운드 동기화 스레드가 쓰기 트랜잭션(write transaction)을 완료할 때까지 대기할 때 UI가 중단되는 것처럼 보일 가능성이 약간 있습니다. 따라서 Device Sync를 사용할 때는 메인 스레드에 쓰지 않는 것이 좋습니다.

구독 세트에 대한 모든 쓰기 트랜잭션(write transaction)에는 성능이 소모됩니다. 세션 중에 영역 객체를 여러 번 업데이트해야 하는 경우 모든 변경이 완료될 때까지 편집한 객체를 메모리에 보관하는 것이 좋습니다. 이렇게 하면 모든 변경 사항 대신 완전하고 업데이트된 객체만 영역에 기록하므로 동기화 성능이 향상됩니다.

돌아가기

데이터 동기화