Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

๋™๊ธฐํ™” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ - Swift SDK

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ๋™๊ธฐํ™” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •
  • ์ž๋™ ๋ฐ ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •
  • ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ ์ง€์ •
  • ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ
  • ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ๋‚ด์šฉ ๋ณต๊ตฌ
  • ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ๋‚ด์šฉ ์‚ญ์ œ
  • ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ
  • ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํด๋ฐฑ
  • ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ

Realm Mobile Sync๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ์‹คํŒจํ•œ ๋™๊ธฐํ™” ๊ด€๋ จ API ํ˜ธ์ถœ์„ ๊ฐ์ง€ํ•˜๊ณ  ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

ํŒ

์ผ๋ฐ˜์ ์ธ Device Sync ์˜ค๋ฅ˜ ๋ชฉ๋ก๊ณผ ์ฒ˜๋ฆฌํ•˜๋‹ค ๋ฐฉ๋ฒ•์€ App Services Device Sync ๋ฌธ์„œ์—์„œ ๋™๊ธฐํ™” ์˜ค๋ฅ˜ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

RLMSyncManager ์‹ฑ๊ธ€ํ†ค์— ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Swift SDK ๋Š” ์˜ค๋ฅ˜ ๊ฐ์ฒด ๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ RLMSyncSession ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

Realm ์€ ๋„๋ฉ”์ธ์ด RLMSyncErrorDomain ์ธ NSError ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋™๊ธฐํ™” ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฝ”๋“œ์— ํ•™์Šต ๋ณด๋ ค๋ฉด RLMSyncError ๋ฐ RLMSyncAuthError์˜ ์ •์˜๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

RLMApp *app = [RLMApp appWithId:YOUR_APP_ID];
// Access the sync manager for the app
RLMSyncManager *syncManager = [app syncManager];
syncManager.errorHandler = ^(NSError *error, RLMSyncSession *session) {
// handle error
};

SyncManager ์‹ฑ๊ธ€ํ†ค์— ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. SyncManager ์‹ฑ๊ธ€ํ†ค์— ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Swift SDK๋Š” ์˜ค๋ฅ˜ ๊ฐ์ฒด ๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ SyncSession ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

let app = App(id: YOUR_APP_SERVICES_APP_ID)
app.syncManager.errorHandler = { error, session in
// handle error
}

ํŒ

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ ์ˆ˜์ค€ ์„ค์ • ๋˜๋Š” ๋กœ๊ฑฐ ์‚ฌ์šฉ์ž ์ง€์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ ์ˆ˜์ค€ ์„ค์ • - Swift SDK๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Device Sync ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์€ ์„œ๋ฒ„ ์˜ ํŠน์ • ๋™๊ธฐํ™” ์˜์—ญ ์ด ๋” ์ด์ƒ ํด๋ผ์ด์–ธํŠธ ์˜์—ญ ๊ณผ ๋™๊ธฐํ™” ํ•  ์ˆ˜ ์—†์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ ์•ฑ ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ž‘์—… ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ๋Š” ๋™๊ธฐํ™” ๊ธฐ๋Šฅ ์„ ๋ณต์› ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์˜์—ญ ์„ ์„œ๋ฒ„ ์™€ ์ผ์น˜ํ•˜๋Š” ์ƒํƒœ ๋กœ ์žฌ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์˜ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์—†๋Š” ์˜์—ญ์— ์•„์ง ์„œ๋ฒ„์™€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Realm SDK๋Š” ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ”„๋กœ์„ธ์Šค ์ค‘์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์ด ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Go App Services ๋ฌธ์„œ์˜ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Realm SDK๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋Š” Realm์„ ๋‹ซ๊ฑฐ๋‚˜ ์•Œ๋ฆผ์„ ๋ˆ„๋ฝํ•˜์ง€ ์•Š๊ณ  ๋กœ์ปฌ Realm ํŒŒ์ผ์„ ๋™๊ธฐํ™” ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.

.manual ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋Š” ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“œ ๊ฐ„์˜ ์ฐจ์ด์ ์€ ์•„์ง ๋ฐฑ์—”๋“œ์— ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ธฐ๊ธฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด .recoverUnsyncedChanges ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์ด ๋ฐœ์ƒํ•  ๋•Œ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค์ • ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์„ค์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ํŠน์ • ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 10.32.0์—์„œ ๋ณ€๊ฒฝ๋จ: ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ์ถ”๊ฐ€, ํ๊ธฐ๋กœ์ปฌ ์ด๋ฆ„ ๋ณ€๊ฒฝ๋จ

Swift SDK ๋Š” SyncConfiguration ์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ ๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. .clientResetMode ์ž…๋‹ˆ๋‹ค. ์†์„ฑ.

// Specify the clientResetMode when you create the SyncConfiguration.
// If you do not specify, this defaults to `.recoverUnsyncedChanges` mode.
var configuration = user.flexibleSyncConfiguration(clientResetMode: .recoverUnsyncedChanges())

์ด ์†์„ฑ ์€ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜• ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • .recoverUnsyncedChanges

  • .recoverOrDiscardUnsyncedChanges

  • .discardUnsyncedChanges

  • .manual

๊ตฌ์„ฑ์—์„œ .clientResetMode ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ .recoverUnsyncedChanges ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ”„๋กœ์„ธ์Šค ์ค‘์— ์‹คํ–‰ํ•  before ๋ฐ after ์ฐจ๋‹จ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ค‘์š”ํ•œ ๋ณต๊ตฌ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// A block called after a client reset error is detected, but before the
// client recovery process is executed.
// This block could be used for any custom logic, reporting, debugging etc.
// This is one example, but your usage may vary.
let beforeClientResetBlock: (Realm) -> Void = { before in
var recoveryConfig = Realm.Configuration()
recoveryConfig.fileURL = myRecoveryPath
do {
try before.writeCopy(configuration: recoveryConfig)
// The copied realm could be used later for recovery, debugging, reporting, etc.
} catch {
// handle error
}
}
// A block called after the client recovery process has executed.
// This block could be used for custom recovery, reporting, debugging etc.
// This is one example, but your usage may vary.
let afterClientResetBlock: (Realm, Realm) -> Void = { before, after in
// let res = after.objects(myClass.self)
// if (res.filter("primaryKey == %@", object.primaryKey).first != nil) {
// // ...custom recovery logic...
// } else {
// // ...custom recovery logic...
// }
// }
}
do {
let app = App(id: YOUR_APP_SERVICES_APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var configuration = user.flexibleSyncConfiguration(clientResetMode:
.recoverOrDiscardUnsyncedChanges(
beforeReset: beforeClientResetBlock,
afterReset: afterClientResetBlock))
} catch {
print("Error logging in user: \(error.localizedDescription)")
}

์•ฑ์— ํŠน์ • ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ .manual ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ•ธ๋“ค๋Ÿฌ ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ค‘์— ์•ฑ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํŠน์ • ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ์ง์ด ์žˆ๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๊ทœ์น™ ์ด ์•ฑ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์•ฑ์—์„œ Swift SDK ๋ฒ„์ „ 10.24.2 ์ดํ•˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ .clientResetMode ์€(๋Š”) SyncConfiguration ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๋Š” Device Sync๋ฅผ ๊ตฌ์„ฑ ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด Realm์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ:

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์—†๊ฑฐ๋‚˜ ์†์ƒ์ ์ด์ง€ ์•Š์€ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ๋Š” ์ˆ˜๋™ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์—์„œ ํ˜ธํ™˜์„ฑ์ด ์†์ƒ๋˜๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋Š” ์ž๋™ ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹จ์ ˆ์  ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ๊ณผ ๋‹จ์ ˆ์ ์ด์ง€ ์•Š์€ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹จ์ ˆ์  ๋ณ€๊ฒฝ๊ณผ ๋‹จ์ ˆ์ ์ด์ง€ ์•Š์€ ๋ณ€๊ฒฝ ๋น„๊ต๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฒ„์ „ 10.32.0์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ.

ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ค‘์— ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์•„์ง ๋ฐฑ์—”๋“œ ์™€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋กœ์ปฌ ์˜์—ญ ์˜ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์œผ๋กœ App Services App ์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ ์—์„œ ์•„์ง ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•˜๋ ค๋ฉด SyncConfiguration ์—์„œ .clientResetMode ๋ฅผ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•˜๋‹ค ํ•ฉ๋‹ˆ๋‹ค.

  • .recoverUnsyncedChanges: ์ด ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ญ์ œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ ์ด ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.

  • .recoverOrDiscardUnsyncedChanges: ํด๋ผ์ด์–ธํŠธ๋Š” ๋จผ์ € ์•„์ง ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ญ์ œ ํ•˜์ง€๋งŒ ๊ณ„์† ์ž๋™์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ญ์ œํ•˜๋„๋ก ์ž๋™ ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์ด ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

// Specify the clientResetMode when you create the SyncConfiguration.
// If you do not specify, this defaults to `.recoverUnsyncedChanges` mode.
var configuration = user.flexibleSyncConfiguration(clientResetMode: .recoverUnsyncedChanges())

์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์žˆ๊ฑฐ๋‚˜ Device Sync ๊ตฌ์„ฑ์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ณต๊ตฌ ๋ชจ๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์—์„œ ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํด๋ฐฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๊ทœ์น™์€ ๋ฐฑ์—”๋“œ์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ํ†ตํ•ฉ๋˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ „์— ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๊ฐ€ ์„œ๋ฒ„์—์„œ ์‚ญ์ œ๋˜์—ˆ์ง€๋งŒ ๋ณต๊ตฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ˆ˜์ •๋œ ๊ฒฝ์šฐ ์‚ญ์ œ๊ฐ€ ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด๊ฐ€ ๋ณต๊ตฌ ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์‚ญ์ œ๋˜๊ณ  ์„œ๋ฒ„์—์„œ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ์‚ญ์ œ ๋ช…๋ น์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋™์ผํ•œ ํ•„๋“œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 10.32.0์—์„œ ๋ณ€๊ฒฝ๋จ: .discardLocal ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.discardUnsyncedChanges

๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์‚ญ์ œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ ๋Š” ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์— ์„ฑ๊ณต์ ์ธ ์ดํ›„ ์ด๋ฃจ์–ด์ง„ ๋ชจ๋“  ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋กœ์ปฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์˜๊ตฌ์ ์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์•ฑ ์— Device Sync ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๊ทœ์น™ ๊ณผ ์ผ๊ด€์ ์ธ ํ•˜์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋˜๋Š” ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ ์ด ๋ชจ๋“œ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์•„์ง ๋ฐฑ์—”๋“œ์— ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์‚ญ์ œ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ญ์ œํ•˜๋Š” ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด SyncConfiguration ์—์„œ .clientResetMode ๋ฅผ .discardUnsyncedChanges ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

do {
let app = App(id: APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var config = user.flexibleSyncConfiguration(clientResetMode: .discardUnsyncedChanges())
} catch {
print("Error logging in user: \(error.localizedDescription)")
}

์ฐธ๊ณ 

๋ณต๊ตฌ ํ›„ ์‚ญ์ œ

๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ณต๊ตฌ์—์„œ .recoverOrDiscardUnsyncedChanges ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” .

์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์‚ญ์ œ ๋ชจ๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์—์„œ ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํด๋ฐฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.clientResetMode ์— .manual ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

.manual ๋ชจ๋“œ ์—์„œ๋Š” ์ž์ฒด ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋Š” ErrorReportingBlock ์„ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ์ž๋™ ํด๋ผ์ด์–ธํŠธ ๋ณต๊ตฌ ๋ชจ๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ž๋™ ๋ณต๊ตฌ ๋กœ์ง์ด ์•ฑ ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ .manual ๋ชจ๋“œ ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

do {
let app = App(id: APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var config = user.flexibleSyncConfiguration(clientResetMode: .manual())
} catch {
print("Error logging in user: \(error.localizedDescription)")
}

ํŒ

์ด์ „ ๋ฒ„์ „์˜ SDK๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ์ˆ˜๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜๋™์œผ๋กœ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์‹œ ๋ฅผ ๋ณด๋ ค๋ฉด ์—์„œ ์ด Github์˜ˆ์‹œ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์†์ƒ์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์™„๋ฃŒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ํ”„๋กœ์„ธ์Šค๋Š” ์ˆ˜๋™ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ์—๊ฒŒ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž๋™ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ๋ชจ๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • .recoverUnsyncedChanges

  • .recoverOrDiscardUnsyncedChanges

  • .discardUnsyncedChanges

RLMApp ์˜ RLMSyncManager ์ธ์Šคํ„ด์Šค ๋ฅผ ํ†ตํ•ด ์ด ๋Œ€์ฒด ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๋‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฑ ์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์กฐ์น˜ ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ƒํ™ฉ์—์„œ๋Š” ์ˆ˜๋™ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ๋„๊ตฌ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

RLMApp *app = [RLMApp appWithId:YOUR_APP_ID];
[[app syncManager] setErrorHandler:^(NSError *error, RLMSyncSession *session) {
if (error.code == RLMSyncErrorClientResetError) {
// TODO: Invalidate all open realm instances
// TODO: Restore the local changes backed up at [error rlmSync_clientResetBackedUpRealmPath]
[RLMSyncSession immediatelyHandleError:[error rlmSync_errorActionToken] syncManager:[app syncManager]];
return;
}
// Handle other errors...
}];

SyncManager ๋ฅผ ํ†ตํ•ด ์ด ๋Œ€์ฒด ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ƒํ™ฉ์—์„œ๋Š” ์ˆ˜๋™ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋„๊ตฌ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

func handleClientReset() {
// Report the client reset error to the user, or do some custom logic.
}
do {
let app = App(id: APP_ID)
let user = try await app.login(credentials: Credentials.anonymous)
var config = user.flexibleSyncConfiguration(clientResetMode: .recoverOrDiscardUnsyncedChanges())
// If client recovery fails,
app.syncManager.errorHandler = { error, session in
guard let syncError = error as? SyncError else {
fatalError("Unexpected error type passed to sync error handler! \(error)")
}
switch syncError.code {
case .clientResetError:
if let (path, clientResetToken) = syncError.clientResetInfo() {
handleClientReset()
SyncSession.immediatelyHandleError(clientResetToken, syncManager: app.syncManager)
}
default:
// Handle other errors...
()
}
}
} catch {
print("Error: \(error.localizedDescription)")
}

Device Sync๋ฅผ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐํ™”๋ฅผ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ—ˆ์šฉํ•˜๋ฉด ์ด์ „์— ๋™๊ธฐํ™”๋กœ ์—ฐ๊ฒฐํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๊นŒ์ง€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ๋™๊ธฐํ™”๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์—์„œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—์„œ ์˜์—ญ์˜ ์ƒˆ ๋ณต์‚ฌ๋ณธ์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ํด๋ผ์ด์–ธํŠธ์— ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์˜ค๋ฅ˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด trigger ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์กฐ๊ฑด์ด ๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ฒ˜๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ๋™๊ธฐํ™”๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

  2. Realm Mobile Sync๋ฅผ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  3. ํด๋ผ์ด์–ธํŠธ ์•ฑ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋™์•ˆ ๋™๊ธฐํ™”๋ฅผ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ •์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ์กด์˜ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์žฌ์„ค์ • ์ฒ˜๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

๋Œ์•„๊ฐ€๊ธฐ

๋™๊ธฐํ™”๋œ Realm์— ์“ฐ๊ธฐ