我有两个相关的问题。
问题一:让Conflict Resolution Handler
和Dataset Merge Handler
生效。我已经多次阅读了the documentation,但我没有看到任何成功,文档最多也是模糊的。似乎块处理程序似乎永远不会被调用。
如果我通过脸谱证明,它需要我之前的Unauthenticated
身份并将其合并到facebook身份中。但是,现在我有两个冲突的数据集条目显示该facebook身份:
以下是我正在做的事情的一个例子:
- (void)synchronizeCognito
{
// Initialize the Cognito Sync client
AWSCognito *syncClient = [AWSCognito defaultCognito];
AWSCognitoDataset *dataset = [syncClient openOrCreateDataset:@"testing"];
// Create a record in a dataset and synchronize with the server
[dataset setString:identifier forKey:@"test1"];
[dataset setString:token forKey:@"test2"];
syncClient.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
NSLog(@"%@", dataset);
// always choose local changes
return [conflict resolveWithRemoteRecord];
};
dataset.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
// override and always choose remote changes
return [conflict resolveWithRemoteRecord];
};
syncClient.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) {
// Blindly delete the datasets
for (NSString *name in datasets) {
AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name];
[merged clear];
[merged synchronize];
}
};
// synchronize the data
[dataset synchronize];
}
问题二:
再次,当我用facebook验证我的unauthenticated
身份时,它将两者合并。我明白了:identity changed from us-east-1:b0a5b4c4-8d7b-4564-9f92-5ea49bbfdcdc to us-east-1:f0bea5d1-a888-4f8f-8957-6589d9700c1e
但如果我这样做:
- (NSString *)getTest
{
AWSCognitoDataset *dataset = [syncClient openOrCreateDataset:@"testing"];
return [dataset stringForKey:@"test1"];
}
它返回来自OLD身份数据存储区的test1值数据,而不是新的facebook身份数据存储区,即使它们现在已经切换了。我怀疑是因为上面没有调用冲突或合并处理。
答案 0 :(得分:1)
很抱歉这个混乱。在此方案中永远不会调用您的冲突处理程序。仅当本地和远程数据在同步之间发生更改时,才会发生Amazon Cognito中的冲突。由于您正在更改数据和同时合并标识,因此会发生合并流。
检测到身份合并时,Amazon Cognito库会执行以下操作:
这意味着如果您进行了更改但未进行同步,则登录并导致身份合并,除非您使用developer guide中的第二个流,否则本地更改将永远不会传播到远程同步存储并根据需要复制数据。我怀疑这是造成你第二个问题的原因。
至于你的第一个,你确定没有调用合并处理程序吗?你能为你的处理程序添加一些调试,看看它是否真的被调用了吗?