๋๊ธฐํ ์ค๋ฅ ์ฒ๋ฆฌ - 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)") }
ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ฒ๋ฆฌ ํ ์คํธ
๋๊ธฐํ๋ฅผ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ํ์ฉํ๋ฉด ์ด์ ์ ๋๊ธฐํ๋ก ์ฐ๊ฒฐํ ํด๋ผ์ด์ธํธ๋ ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ ์ํํ ๋๊น์ง ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๋๊ธฐํ๋ฅผ ์ข ๋ฃํ๋ฉด ํด๋ผ์ด์ธํธ์ ๋๊ธฐํ๋ฅผ ํ์ฉํ๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์๋ฒ์์ ์ญ์ ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ฒ์์ ์์ญ์ ์ ๋ณต์ฌ๋ณธ์ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค. ์๋ฒ๋ ์ด๋ฌํ ํด๋ผ์ด์ธํธ์ ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ค๋ฅ๋ฅผ ๋ณด๋ ๋๋ค. ๋ฐ๋ผ์ ๋๊ธฐํ๋ฅผ ์ข ๋ฃํ๋ฉด trigger ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์กฐ๊ฑด์ด ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ฒ๋ฆฌ๋ฅผ ํ ์คํธํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ๋๊ธฐํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
Realm Mobile Sync๋ฅผ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ํ์ฑํํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ฑ์ ๋ค์ ์คํํฉ๋๋ค. ์ฑ์ด ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๊ณ ํ ๋ ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ผ ํฉ๋๋ค.
๊ฒฝ๊ณ
ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ๋ ๋์ ๋๊ธฐํ๋ฅผ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ํ์ฑํํด์ผ ํ ์ ์์ต๋๋ค. ๋๊ธฐํ๋ฅผ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ํ์ฑํํ๋ฉด ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ ์๋ฃํ ๋๊น์ง ๊ธฐ์กด์ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๋๊ธฐํํ ์ ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์ ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ ์ฌ์ค์ ์ฒ๋ฆฌ๋ฅผ ํ ์คํธํ์ธ์.