

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 이벤트 콜백 처리
<a name="handling-callbacks"></a>

****  
Amazon Cognito Sync를 처음 사용하는 경우 [AWS AppSync](https://aws.amazon.com/appsync/)를 사용하세요. Amazon Cognito Sync와 마찬가지로 AWS AppSync 는 디바이스 간에 애플리케이션 데이터를 동기화하기 위한 서비스입니다.  
앱 기본 설정이나 게임 상태 같은 사용자 데이터를 동기화할 수 있습니다. 또한 이러한 기능을 더욱 확장해, 복수의 사용자가 공유 데이터를 실시간으로 동기화하고 협업할 수 있게 합니다.

Amazon Cognito Sync 개발자는 다양한 콜백을 구현하여 다양한 동기화 이벤트 및 시나리오를 처리할 수 있습니다. Android SDK의 `SyncCallback` 인터페이스는 데이터세트가 성공적으로 다운로드되면 `onSuccess()`, 예외가 발생하면 `onFailure()`, 로컬 데이터와 원격 데이터 간의 충돌을 해결하기 위한 `onConflict()` 등 데이터세트 동기화에 대한 알림을 구성합니다.

iOS SDK에서 `AWSCognitoDidStartSynchronizeNotification`과 같은 유사한 알림을 등록하고 충돌 해결을 위해 `AWSCognitoRecordConflictHandler`와 같은 처리기를 설정할 수 있습니다. JavaScript, Unity 및 Xamarin 플랫폼에는 유사한 콜백 메커니즘이 있습니다. 이러한 콜백을 구현하면 애플리케이션이 Amazon Cognito Sync를 사용할 때 발생할 수 있는 다양한 동기화 이벤트 및 시나리오를 정상적으로 처리할 수 있습니다.

## Android
<a name="handling-callbacks-1.android"></a>

**SyncCallback 인터페이스**

`SyncCallback` 인터페이스를 구현하여 앱에서 데이터 세트 동기화에 대한 알림을 받을 수 있습니다. 그러면 앱에서는 로컬 데이터 삭제, 미인증 및 인증 프로파일 병합 및 동기화 충돌 해결에 대해 결정할 수 있습니다. 인터페이스에 필요한 다음 메서드를 구현해야 합니다.
+ `onSuccess()`
+ `onFailure()`
+ `onConflict()`
+ `onDatasetDeleted()`
+ `onDatasetsMerged()`

모든 콜백을 지정하지 않으려면 `DefaultSyncCallback` 클래스를 사용할 수도 있습니다. 이 클래스는 모든 콜백에 대해 기본적으로 빈 구현을 제공합니다.

**onSuccess**

`onSuccess()` 콜백은 동기화 스토어에서 데이터 세트를 성공적으로 다운로드한 경우 트리거됩니다.

```
@Override
public void onSuccess(Dataset dataset, List<Record> newRecords) {
}
```

**onFailure**

동기화 중 예외가 발생할 경우 onFailure()가 호출됩니다.

```
@Override
public void onFailure(DataStorageException dse) {
}
```

**onConflict**

로컬 스토어와 동기화 스토어에서 동일한 키가 수정된 경우 충돌이 발생할 수 있습니다. `onConflict()` 메서드는 충돌 해결을 처리합니다. 이 메서드를 구현하지 않으면 Amazon Cognito Sync 클라이언트는 기본적으로 가장 최근 변경 사항을 사용합니다.

```
@Override
public boolean onConflict(Dataset dataset, final List<SyncConflict> conflicts) {
    List<Record> resolvedRecords = new ArrayList<Record>();
    for (SyncConflict conflict : conflicts) {
        /* resolved by taking remote records */
        resolvedRecords.add(conflict.resolveWithRemoteRecord());

        /* alternately take the local records */
        // resolvedRecords.add(conflict.resolveWithLocalRecord());

        /* or customer logic, say concatenate strings */
        // String newValue = conflict.getRemoteRecord().getValue()
        //     + conflict.getLocalRecord().getValue();
        // resolvedRecords.add(conflict.resolveWithValue(newValue);
    }
    dataset.resolve(resolvedRecords);

    // return true so that synchronize() is retried after conflicts are resolved
    return true;
}
```

**onDatasetDeleted**

데이터 세트가 삭제되면 Amazon Cognito 클라이언트는 `SyncCallback` 인터페이스를 사용하여 로컬로 캐싱된 데이터 세트의 사본도 삭제해야 하는지 여부를 확인합니다. `onDatasetDeleted()` 메서드를 구현하여 로컬 데이터를 사용하여 수행할 사항을 클라이언트 SDK에게 알립니다.

```
@Override
public boolean onDatasetDeleted(Dataset dataset, String datasetName) {
    // return true to delete the local copy of the dataset
    return true;
}
```

**onDatasetMerged**

이전에 연결되지 않은 두 자격 증명이 서로 연결되면 해당 데이터 세트가 모두 병합됩니다. 애플리케이션은 `onDatasetsMerged()` 메서드를 통해 병합에 대한 알림을 받습니다.

```
@Override
public boolean onDatasetsMerged(Dataset dataset, List<String> datasetNames) {
    // return false to handle Dataset merge outside the synchronization callback
    return false;
}
```

## iOS - Objective-C
<a name="handling-callbacks-1.ios-objc"></a>

**동기화 알림**

Amazon Cognito 클라이언트는 동기화를 호출하는 중 여러 `NSNotification` 이벤트를 출력합니다. 표준 `NSNotificationCenter`를 통해 이러한 알림을 모니터링하도록 등록할 수 있습니다.

```
[NSNotificationCenter defaultCenter]
  addObserver:self
  selector:@selector(myNotificationHandler:)
  name:NOTIFICATION_TYPE
  object:nil];
```

Amazon Cognito는 아래에 나열된 대로 5가지 알림 유형을 지원합니다.

**AWSCognitoDidStartSynchronizeNotification**

동기화 작업이 시작될 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트가 포함되어 있습니다.

**AWSCognitoDidEndSynchronizeNotification**

동기화 작업이 완료(성공 등)될 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트가 포함되어 있습니다.

**AWSCognitoDidFailToSynchronizeNotification**

동기화 작업이 실패할 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트와 실패의 원인인 오류가 포함된 핵심 오류가 포함되어 있습니다.

**AWSCognitoDidChangeRemoteValueNotification**

로컬 변경 사항이 Amazon Cognito에 성공적으로 푸시된 경우 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트와 푸시된 레코드 키의 NSArray가 포함된 핵심 키가 포함되어 있습니다.

**AWSCognitoDidChangeLocalValueFromRemoteNotification**

동기화 작업으로 인해 로컬 값이 변경될 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트와 변경된 레코드 키의 NSArray가 포함된 핵심 키가 포함되어 있습니다.

**충돌 해결 핸들러**

동기화 작업 중 로컬 스토어와 동기화 스토어에서 동일한 키가 수정된 경우 충돌이 발생할 수 있습니다. 충돌 해결 핸들러를 설정하지 않은 경우 Amazon Cognito에서는 기본적으로 가장 최근 업데이트를 선택합니다.

AWSCognitoRecordConflictHandler를 구현하고 할당하면 기본 충돌 해결을 변경할 수 있습니다. AWSCognitoConflict 입력 파라미터 충돌에는 로컬로 캐시된 데이터와 동기화 스토어의 충돌 레코드 둘 모두에 대한 AWSCognitoRecord 객체가 포함됩니다. AWSCognitoConflict를 사용하면 로컬 레코드 [conflict resolveWithLocalRecord]와 원격 레코드 [conflict resolveWithRemoteRecord] 또는 새로운 값인 [conflict resolveWithValue:value]를 사용하여 충돌을 해결할 수 있습니다. 이 메서드에서 nil을 반환하면 동기화가 계속되지 않으며, 다음에 동기화 프로세스를 시작할 때 충돌이 다시 표시됩니다.

클라이언트 수준에서 충돌 해결 핸들러를 설정할 수 있습니다.

```
client.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
    // always choose local changes
    return [conflict resolveWithLocalRecord];
};
```

또는 데이터 세트 수준에서 해당 핸들러를 설정할 수 있습니다.

```
dataset.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
    // override and always choose remote changes
    return [conflict resolveWithRemoteRecord];
};
```

**데이터 세트 삭제 핸들러**

데이터 세트가 삭제되면 Amazon Cognito 클라이언트는 `AWSCognitoDatasetDeletedHandler`를 사용하여 로컬로 캐싱된 데이터 세트의 사본도 삭제해야 하는지 여부를 확인합니다. `AWSCognitoDatasetDeletedHandler`가 구현되지 않으면 로컬 데이터가 자동으로 제거됩니다. 제거하기 전에 로컬 데이터의 사본을 유지하거나 로컬 데이터를 유지하려면 `AWSCognitoDatasetDeletedHandler`를 구현하세요.

클라이언트 수준에서 데이터 세트 삭제 핸들러를 설정할 수 있습니다.

```
client.datasetDeletedHandler = ^BOOL (NSString *datasetName) {
    // make a backup of the data if you choose
    ...
    // delete the local data (default behavior)
    return YES;
};
```

또는 데이터 세트 수준에서 해당 핸들러를 설정할 수 있습니다.

```
dataset.datasetDeletedHandler = ^BOOL (NSString *datasetName) {
    // override default and keep the local data
    return NO;
};
```

**데이터 세트 병합 핸들러**

이전에 연결되지 않은 두 자격 증명이 서로 연결되면 해당 데이터 세트가 모두 병합됩니다. 애플리케이션은 `DatasetMergeHandler`를 통해 병합에 대한 알림을 받습니다. 핸들러는 루트 데이터 세트의 이름과 루트 데이터 세트의 병합으로 표시된 데이터 세트 이름의 어레이를 받습니다.

`DatasetMergeHandler`가 구현되지 않으면 이러한 데이터 세트가 무시되지만, 자격 증명의 20개 최대 총 데이터 세트에서 공간을 계속 소비합니다.

클라이언트 수준에서 데이터 세트 병합 핸들러를 설정할 수 있습니다.

```
client.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) {
    // Blindly delete the datasets
    for (NSString *name in datasets) {
        AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name];
       [merged clear];
       [merged synchronize];
    }
};
```

또는 데이터 세트 수준에서 해당 핸들러를 설정할 수 있습니다.

```
dataset.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) {
    // Blindly delete the datasets
    for (NSString *name in datasets) {
        AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name];
        // do something with the data if it differs from existing dataset
        ...
        // now delete it
        [merged clear];
        [merged synchronize];
    }
};
```

## iOS - Swift
<a name="handling-callbacks-1.ios-swift"></a>

**동기화 알림**

Amazon Cognito 클라이언트는 동기화를 호출하는 중 여러 `NSNotification` 이벤트를 출력합니다. 표준 `NSNotificationCenter`를 통해 이러한 알림을 모니터링하도록 등록할 수 있습니다.

```
NSNotificationCenter.defaultCenter().addObserver(observer: self,
   selector: "myNotificationHandler",
   name:NOTIFICATION_TYPE,
   object:nil)
```

Amazon Cognito는 아래에 나열된 대로 5가지 알림 유형을 지원합니다.

**AWSCognitoDidStartSynchronizeNotification**

동기화 작업이 시작될 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트가 포함되어 있습니다.

**AWSCognitoDidEndSynchronizeNotification**

동기화 작업이 완료(성공 등)될 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트가 포함되어 있습니다.

**AWSCognitoDidFailToSynchronizeNotification**

동기화 작업이 실패할 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트와 실패의 원인인 오류가 포함된 핵심 오류가 포함되어 있습니다.

**AWSCognitoDidChangeRemoteValueNotification**

로컬 변경 사항이 Amazon Cognito에 성공적으로 푸시된 경우 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트와 푸시된 레코드 키의 NSArray가 포함된 핵심 키가 포함되어 있습니다.

**AWSCognitoDidChangeLocalValueFromRemoteNotification**

동기화 작업으로 인해 로컬 값이 변경될 때 호출됩니다. `userInfo`에는 동기화되는 데이터 세트의 이름인 핵심 데이터 세트와 변경된 레코드 키의 NSArray가 포함된 핵심 키가 포함되어 있습니다.

**충돌 해결 핸들러**

동기화 작업 중 로컬 스토어와 동기화 스토어에서 동일한 키가 수정된 경우 충돌이 발생할 수 있습니다. 충돌 해결 핸들러를 설정하지 않은 경우 Amazon Cognito에서는 기본적으로 가장 최근 업데이트를 선택합니다.

`AWSCognitoRecordConflictHandler`를 구현하고 할당하면 기본 충돌 해결을 변경할 수 있습니다. `AWSCognitoConflict` 입력 파라미터 충돌에는 로컬로 캐시된 데이터와 동기화 스토어의 충돌 레코드 둘 모두에 대한 `AWSCognitoRecord` 객체가 포함됩니다. `AWSCognitoConflict`를 사용하면 로컬 레코드 [conflict resolveWithLocalRecord]와 원격 레코드 [conflict resolveWithRemoteRecord] 또는 새로운 값인 [conflict resolveWithValue:value]를 사용하여 충돌을 해결할 수 있습니다. 이 메서드에서 nil을 반환하면 동기화가 계속되지 않으며, 다음에 동기화 프로세스를 시작할 때 충돌이 다시 표시됩니다.

클라이언트 수준에서 충돌 해결 핸들러를 설정할 수 있습니다.

```
client.conflictHandler = {
    (datasetName: String?, conflict: AWSCognitoConflict?) -> AWSCognitoResolvedConflict? in
    return conflict.resolveWithLocalRecord()
}
```

또는 데이터 세트 수준에서 해당 핸들러를 설정할 수 있습니다.

```
dataset.conflictHandler = {
    (datasetName: String?, conflict: AWSCognitoConflict?) -> AWSCognitoResolvedConflict? in
    return conflict.resolveWithLocalRecord()
}
```

**데이터 세트 삭제 핸들러**

데이터 세트가 삭제되면 Amazon Cognito 클라이언트는 `AWSCognitoDatasetDeletedHandler`를 사용하여 로컬로 캐싱된 데이터 세트의 사본도 삭제해야 하는지 여부를 확인합니다. `AWSCognitoDatasetDeletedHandler`가 구현되지 않으면 로컬 데이터가 자동으로 제거됩니다. 제거하기 전에 로컬 데이터의 사본을 유지하거나 로컬 데이터를 유지하려면 `AWSCognitoDatasetDeletedHandler`를 구현하세요.

클라이언트 수준에서 데이터 세트 삭제 핸들러를 설정할 수 있습니다.

```
client.datasetDeletedHandler = {
      (datasetName: String!) -> Bool in
      // make a backup of the data if you choose
      ...
      // delete the local data (default behaviour)
      return true
}
```

또는 데이터 세트 수준에서 해당 핸들러를 설정할 수 있습니다.

```
dataset.datasetDeletedHandler = {
      (datasetName: String!) -> Bool in
      // make a backup of the data if you choose
      ...
      // delete the local data (default behaviour)
      return true
}
```

**데이터 집합 병합 핸들러**

이전에 연결되지 않은 두 자격 증명이 서로 연결되면 해당 데이터 세트가 모두 병합됩니다. 애플리케이션은 `DatasetMergeHandler`를 통해 병합에 대한 알림을 받습니다. 핸들러는 루트 데이터 세트의 이름과 루트 데이터 세트의 병합으로 표시된 데이터 세트 이름의 어레이를 받습니다.

`DatasetMergeHandler`가 구현되지 않으면 이러한 데이터 세트가 무시되지만, 자격 증명의 20개 최대 총 데이터 세트에서 공간을 계속 소비합니다.

클라이언트 수준에서 데이터 세트 병합 핸들러를 설정할 수 있습니다.

```
client.datasetMergedHandler = {
    (datasetName: String!, datasets: [AnyObject]!) -> Void in
    for nameObject in datasets {
        if let name = nameObject as? String {
            let merged = AWSCognito.defaultCognito().openOrCreateDataset(name)
            merged.clear()
            merged.synchronize()
        }
    }
}
```

또는 데이터 세트 수준에서 해당 핸들러를 설정할 수 있습니다.

```
dataset.datasetMergedHandler = {
    (datasetName: String!, datasets: [AnyObject]!) -> Void in
    for nameObject in datasets {
        if let name = nameObject as? String {
            let merged = AWSCognito.defaultCognito().openOrCreateDataset(name)
            // do something with the data if it differs from existing dataset
              ...
              // now delete it
            merged.clear()
            merged.synchronize()
        }
    }
}
```

## JavaScript
<a name="handling-callbacks-1.javascript"></a>

**동기화 콜백**

데이터 세트에 대해 synchronize()를 수행하면 선택적으로 콜백을 지정하여 다음의 각 상태를 처리할 수 있습니다.

```
dataset.synchronize({

   onSuccess: function(dataset, newRecords) {
      //...
   },

   onFailure: function(err) {
      //...
   },

   onConflict: function(dataset, conflicts, callback) {
      //...
   },

   onDatasetDeleted: function(dataset, datasetName, callback) {
      //...
   },

  onDatasetMerged: function(dataset, datasetNames, callback) {
      //...
  }

});
```

**onSuccess()**

`onSuccess()` 콜백은 동기화 스토어에서 데이터 세트를 성공적으로 업데이트한 경우 트리거됩니다. 콜백을 정의하지 않으면 동기화가 자동으로 수행됩니다.

```
onSuccess: function(dataset, newRecords) {
   console.log('Successfully synchronized ' + newRecords.length + ' new records.');
}
```

**onFailure()**

동기화 중 예외가 발생할 경우 `onFailure()`가 호출됩니다. 콜백을 정의하지 않으면 동기화가 자동으로 실패합니다.

```
onFailure: function(err) {
   console.log('Synchronization failed.');
   console.log(err);
}
```

**onConflict()**

로컬 스토어와 동기화 스토어에서 동일한 키가 수정된 경우 충돌이 발생할 수 있습니다. `onConflict()` 메서드는 충돌 해결을 처리합니다. 이 메서드를 구현하지 않으면 충돌이 있는 경우 동기화가 중단됩니다.

```
onConflict: function(dataset, conflicts, callback) {

   var resolved = [];

   for (var i=0; i<conflicts.length; i++) {

      // Take remote version.
      resolved.push(conflicts[i].resolveWithRemoteRecord());

      // Or... take local version.
      // resolved.push(conflicts[i].resolveWithLocalRecord());

      // Or... use custom logic.
      // var newValue = conflicts[i].getRemoteRecord().getValue() + conflicts[i].getLocalRecord().getValue();
      // resolved.push(conflicts[i].resovleWithValue(newValue);

   }

   dataset.resolve(resolved, function() {
      return callback(true);
   });

   // Or... callback false to stop the synchronization process.
   // return callback(false);

}
```

**onDatasetDeleted()**

데이터 세트가 삭제되면 Amazon Cognito 클라이언트는 `onDatasetDeleted()` 콜백을 사용하여 로컬로 캐시된 데이터 세트의 사본도 삭제해야 하는지 여부를 결정합니다. 기본적으로 데이터 세트는 삭제되지 않습니다.

```
onDatasetDeleted: function(dataset, datasetName, callback) {

   // Return true to delete the local copy of the dataset.
   // Return false to handle deleted datasets outside the synchronization callback.

   return callback(true);

}
```

**onDatasetMerged()**

이전에 연결되지 않은 두 자격 증명이 서로 연결되면 해당 데이터 세트가 모두 병합됩니다. 애플리케이션은 `onDatasetsMerged()` 콜백을 통해 병합에 대한 알림을 받습니다.

```
onDatasetMerged: function(dataset, datasetNames, callback) {

   // Return true to continue the synchronization process.
   // Return false to handle dataset merges outside the synchronization callback.

   return callback(false);

}
```

## Unity
<a name="handling-callbacks-1.unity"></a>

데이터 세트를 열거나 생성한 후 Synchronize 메서드를 사용할 때 트리거되는 여러 콜백을 해당 데이터 세트에 설정할 수 있습니다. 데이터 세트에 콜백을 등록하는 방법은 다음과 같습니다.

```
dataset.OnSyncSuccess += this.HandleSyncSuccess;
dataset.OnSyncFailure += this.HandleSyncFailure;
dataset.OnSyncConflict = this.HandleSyncConflict;
dataset.OnDatasetMerged = this.HandleDatasetMerged;
dataset.OnDatasetDeleted = this.HandleDatasetDeleted;
```

`SyncSuccess` 및 `SyncFailure`는 = 대신 \$1=를 사용하므로 이에 대해 둘 이상의 콜백을 구독할 수 있습니다.

**OnSyncSuccess**

`OnSyncSuccess` 콜백은 클라우드에서 데이터 세트를 성공적으로 업데이트한 경우 트리거됩니다. 콜백을 정의하지 않으면 동기화가 자동으로 수행됩니다.

```
private void HandleSyncSuccess(object sender, SyncSuccessEvent e)
{
    // Continue with your game flow, display the loaded data, etc.
}
```

**OnSyncFailure**

동기화 중 예외가 발생할 경우 `OnSyncFailure`가 호출됩니다. 콜백을 정의하지 않으면 동기화가 자동으로 실패합니다.

```
private void HandleSyncFailure(object sender, SyncFailureEvent e)
{
    Dataset dataset = sender as Dataset;
    if (dataset.Metadata != null) {
        Debug.Log("Sync failed for dataset : " + dataset.Metadata.DatasetName);
    } else {
        Debug.Log("Sync failed");
    }
    // Handle the error
    Debug.LogException(e.Exception);
}
```

**OnSyncConflict**

로컬 스토어와 동기화 스토어에서 동일한 키가 수정된 경우 충돌이 발생할 수 있습니다. `OnSyncConflict` 콜백은 충돌 해결을 처리합니다. 이 메서드를 구현하지 않으면 충돌이 있는 경우 동기화가 중단됩니다.

```
private bool HandleSyncConflict(Dataset dataset, List < SyncConflict > conflicts)
{
  if (dataset.Metadata != null) {
    Debug.LogWarning("Sync conflict " + dataset.Metadata.DatasetName);
  } else {
    Debug.LogWarning("Sync conflict");
  }
  List < Amazon.CognitoSync.SyncManager.Record > resolvedRecords = new List < Amazon.CognitoSync.SyncManager.Record > ();
  foreach(SyncConflict conflictRecord in conflicts) {
    // SyncManager provides the following default conflict resolution methods:
    //      ResolveWithRemoteRecord - overwrites the local with remote records
    //      ResolveWithLocalRecord - overwrites the remote with local records
    //      ResolveWithValue - to implement your own logic
    resolvedRecords.Add(conflictRecord.ResolveWithRemoteRecord());
  }
  // resolves the conflicts in local storage
  dataset.Resolve(resolvedRecords);
  // on return true the synchronize operation continues where it left,
  //      returning false cancels the synchronize operation
  return true;
}
```

**OnDatasetDeleted**

데이터 세트가 삭제되면 Amazon Cognito 클라이언트는 `OnDatasetDeleted` 콜백을 사용하여 로컬로 캐시된 데이터 세트의 사본도 삭제해야 하는지 여부를 결정합니다. 기본적으로 데이터 세트는 삭제되지 않습니다.

```
private bool HandleDatasetDeleted(Dataset dataset)
  {
      Debug.Log(dataset.Metadata.DatasetName + " Dataset has been deleted");
      // Do clean up if necessary
      // returning true informs the corresponding dataset can be purged in the local storage and return false retains the local dataset
      return true;
  }
```

**OnDatasetMerged**

이전에 연결되지 않은 두 자격 증명이 서로 연결되면 해당 데이터 세트가 모두 병합됩니다. 애플리케이션은 `OnDatasetsMerged` 콜백을 통해 병합에 대한 알림을 받습니다.

```
public bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames)
{
    foreach (string name in mergedDatasetNames)
    {
        Dataset mergedDataset = syncManager.OpenOrCreateDataset(name);
        //Lambda function to delete the dataset after fetching it
        EventHandler<SyncSuccessEvent> lambda;
        lambda = (object sender, SyncSuccessEvent e) => {
            ICollection<string> existingValues = localDataset.GetAll().Values;
            ICollection<string> newValues = mergedDataset.GetAll().Values;

            //Implement your merge logic here

            mergedDataset.Delete(); //Delete the dataset locally
            mergedDataset.OnSyncSuccess -= lambda; //We don't want this callback to be fired again
            mergedDataset.OnSyncSuccess += (object s2, SyncSuccessEvent e2) => {
                localDataset.Synchronize(); //Continue the sync operation that was interrupted by the merge
            };
            mergedDataset.Synchronize(); //Synchronize it as deleted, failing to do so will leave us in an inconsistent state
        };
        mergedDataset.OnSyncSuccess += lambda;
        mergedDataset.Synchronize(); //Asnchronously fetch the dataset
    }

    // returning true allows the Synchronize to continue and false stops it
    return false;
}
```

## Xamarin
<a name="handling-callbacks-1.xamarin"></a>

데이터 세트를 열거나 생성한 후 Synchronize 메서드를 사용할 때 트리거되는 여러 콜백을 해당 데이터 세트에 설정할 수 있습니다. 데이터 세트에 콜백을 등록하는 방법은 다음과 같습니다.

```
dataset.OnSyncSuccess += this.HandleSyncSuccess;
dataset.OnSyncFailure += this.HandleSyncFailure;
dataset.OnSyncConflict = this.HandleSyncConflict;
dataset.OnDatasetMerged = this.HandleDatasetMerged;
dataset.OnDatasetDeleted = this.HandleDatasetDeleted;
```

`SyncSuccess` 및 `SyncFailure`는 = 대신 \$1=를 사용하므로 이에 대해 둘 이상의 콜백을 구독할 수 있습니다.

**OnSyncSuccess**

`OnSyncSuccess` 콜백은 클라우드에서 데이터 세트를 성공적으로 업데이트한 경우 트리거됩니다. 콜백을 정의하지 않으면 동기화가 자동으로 수행됩니다.

```
private void HandleSyncSuccess(object sender, SyncSuccessEventArgs e)
{
    // Continue with your game flow, display the loaded data, etc.
}
```

**OnSyncFailure**

동기화 중 예외가 발생할 경우 `OnSyncFailure`가 호출됩니다. 콜백을 정의하지 않으면 동기화가 자동으로 실패합니다.

```
private void HandleSyncFailure(object sender, SyncFailureEventArgs e)
{
    Dataset dataset = sender as Dataset;
    if (dataset.Metadata != null) {
        Console.WriteLine("Sync failed for dataset : " + dataset.Metadata.DatasetName);
    } else {
        Console.WriteLine("Sync failed");
    }
}
```

**OnSyncConflict**

로컬 스토어와 동기화 스토어에서 동일한 키가 수정된 경우 충돌이 발생할 수 있습니다. `OnSyncConflict` 콜백은 충돌 해결을 처리합니다. 이 메서드를 구현하지 않으면 충돌이 있는 경우 동기화가 중단됩니다.

```
private bool HandleSyncConflict(Dataset dataset, List < SyncConflict > conflicts)
{
  if (dataset.Metadata != null) {
    Console.WriteLine("Sync conflict " + dataset.Metadata.DatasetName);
  } else {
    Console.WriteLine("Sync conflict");
  }
  List < Amazon.CognitoSync.SyncManager.Record > resolvedRecords = new List < Amazon.CognitoSync.SyncManager.Record > ();
  foreach(SyncConflict conflictRecord in conflicts) {
    // SyncManager provides the following default conflict resolution methods:
    //      ResolveWithRemoteRecord - overwrites the local with remote records
    //      ResolveWithLocalRecord - overwrites the remote with local records
    //      ResolveWithValue - to implement your own logic
    resolvedRecords.Add(conflictRecord.ResolveWithRemoteRecord());
  }
  // resolves the conflicts in local storage
  dataset.Resolve(resolvedRecords);
  // on return true the synchronize operation continues where it left,
  //      returning false cancels the synchronize operation
  return true;
}
```

**OnDatasetDeleted**

데이터 세트가 삭제되면 Amazon Cognito 클라이언트는 `OnDatasetDeleted` 콜백을 사용하여 로컬로 캐시된 데이터 세트의 사본도 삭제해야 하는지 여부를 결정합니다. 기본적으로 데이터 세트는 삭제되지 않습니다.

```
private bool HandleDatasetDeleted(Dataset dataset)
{
    Console.WriteLine(dataset.Metadata.DatasetName + " Dataset has been deleted");
    // Do clean up if necessary
    // returning true informs the corresponding dataset can be purged in the local storage and return false retains the local dataset
    return true;
}
```

**OnDatasetMerged**

이전에 연결되지 않은 두 자격 증명이 서로 연결되면 해당 데이터 세트가 모두 병합됩니다. 애플리케이션은 `OnDatasetsMerged` 콜백을 통해 병합에 대한 알림을 받습니다.

```
public bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames)
{
    foreach (string name in mergedDatasetNames)
    {
        Dataset mergedDataset = syncManager.OpenOrCreateDataset(name);

            //Implement your merge logic here

        mergedDataset.OnSyncSuccess += lambda;
        mergedDataset.SynchronizeAsync(); //Asnchronously fetch the dataset
    }

    // returning true allows the Synchronize to continue and false stops it
    return false;
}
```