IMobileServiceSyncHandlerを実装しています。私の目標は、「サーバは常にメカニズムを獲得する」ことです。したがって、競合が検出されると、IMobileServiceSyncHandlerはローカルコピーをサーバーコピーで上書きする必要があります。IMobileServiceSyncHandler - ローカルバージョンをオーバーライド
class MySyncHandler : IMobileServiceSyncHandler
{
public IMobileServiceSyncTable<Error> localTable;
IMobileServiceClient client;
public MySyncHandler(IMobileServiceClient client)
{
this.client = client;
}
public async Task<JObject> ExecuteTableOperationAsync(IMobileServiceTableOperation operation)
{
JObject result = null;
MobileServicePreconditionFailedException conflictError = null;
do
{
try
{
result = await operation.ExecuteAsync();
}
catch (MobileServicePreconditionFailedException e)
{
conflictError = e;
}
if (conflictError != null)
{
JObject serverItem = conflictError.Value;
if (serverItem == null)
{
serverItem = (JObject)(await operation.Table.LookupAsync((string)operation.Item[MobileServiceSystemColumns.Id]));
}
await localTable.UpdateAsync(serverItem);
}
} while (conflictError != null);
return result;
}
public Task OnPushCompleteAsync(MobileServicePushCompletionResult result)
{
return Task.FromResult(0);
}
}
関連する部分は次のとおりです:
await localTable.UpdateAsync(serverItem);
私の考えは、サーバのバージョンを使用してローカルテーブルを更新することです
は、ここに私のコードです。
問題:
これは機能しません。ローカルコピーは変更されません。それはローカルバージョンに残ります。
お手伝いできますか?
conflictError = nullのため、conflictErrorを取得した場合はdo/whileループを終了しません。ループの外側でのみ呼び出されます。明確にすることはできますか? –
はい、これは少し奇妙に見えます。しかし、マイクロソフトの公式の例とループが機能します。私の問題は、localTable.UpdateAsync(serverItem)を待っていることです。は動作しません – OPunktSchmidt
"公式のサンプル"はどこですか?あなたはリンクを提供できますか? localTableが変わらないことをどうお知りしますか? UIに基づいているか、ブレークポイントのデータが表示されますか?また、UpdateAsyncにはパラメータとして競合を提供できるバージョンがオーバーロードされています。あなたはそれを試しましたか? –