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가 발생하는 것으로부터 나는 conflictError = null 때문에 do/while 루프를 종료하지 않을 것입니다. 루프 외부에서만 호출됩니다. 당신은 명확히 할 수 있습니까? –
네, 좀 이상해 보입니다. 그러나 마이크로 소프트와 루프의 공식 사례가 효과가있다. 내 문제는 localTable.UpdateAsync (serverItem);을 기다리고 있습니다. 작동하지 않습니다 – OPunktSchmidt
"공식 샘플"은 어디에 있습니까? 링크를 제공 할 수 있습니까? localTable이 변경되지 않는다는 것을 어떻게 알 수 있습니까? UI를 기반으로하거나 브레이크 포인트의 데이터를 볼 수 있습니까? 또한 UpdateAsync에는 매개 변수로 충돌을 제공 할 수있는 버전이 오버로드되었습니다. 너 그거 해봤 니? –