Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Adicionar sincronização de dispositivo a um aplicativo - Swift SDK

Nesta página

  • Pré-requisitos
  • Adicionar Device Sync a um aplicativo cliente
  • Conecte-se ao backend do Atlas App Services
  • Autenticar um usuário
  • Abrir um realm sincronizado
  • Use o Realm

Dica

Veja também:

Esta página contém informações sobre como adicionar o Device Sync a um aplicativo. Se estiver procurando informações sobre o que é e como funciona o Device Sync , consulte: Atlas App Services: Sincronizar dados.

Before you can access a synced realm from the client, you must Enable sync in the Atlas App Services UI. During this process, you must define queryable fields that match fields in your schema. You also define read and write permissions for app users.

Neste exemplo, nosso modelo inclui um campo ownerId que mapeia para o user.id do usuário Flexible Sync.

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

Passe o ID do aplicativo, que você pode encontrar na IU do Atlas App Services .

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

Autentique um usuário em seu projeto de cliente. Aqui, usaremos a autenticação anônima.

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

Abra o domínio como um domínio sincronizado. Você pode especificar se um domínio sincronizado deve baixar os dados antes de ser aberto. Aqui, usamos uma configuração de Flexible Sync e especificamos que o SDK deve sempre baixar as atualizações mais recentes antes de abrir o domínio. Inicializamos o domínio com uma assinatura inicial. Também especificamos os tipos de objeto que queremos incluir nesse domínio.

Dica

Se a sua aplicação acessar Realm em um contexto do async/await, marque o código com @MainActor para evitar falhas relacionadas a threading.

@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)")
}
}

A sintaxe para ler, gravar e observar alterações em um domínio sincronizado é idêntica à sintaxe para domínios não sincronizados. Enquanto você trabalha com dados locais, um thread em segundo plano integra, carrega e baixa conjuntos de alterações de forma eficiente.

O seguinte código cria um novo objeto Task e o grava no domínio:

@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)
}
}

Importante

Ao usar a sincronização, evite gravações no thread principal

O fato de o Realm realizar integrações de sincronização em um thread em segundo plano significa que, se você escrever em seu domínio no thread principal, há uma pequena chance de sua interface do usuário parecer travar enquanto aguarda que o thread de sincronização em segundo plano termine uma transação de escrita. Portanto, é uma prática recomendada não escrever na thread principal ao usar o Device Sync.

Cada transação de escrita para um conjunto de assinaturas tem um custo de desempenho. Se você precisar fazer várias atualizações em um objeto do Realm durante uma sessão, considere manter objetos editados na memória até que todas as alterações sejam concluídas. Isso melhora o desempenho da sincronização, gravando apenas o objeto completo e atualizado em seu domínio, em vez de cada alteração.

Voltar

Sincronizar dados

Próximo

Configurar e abrir um domínio sincronizado