2017-03-01 1 views
0

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); 

내 생각은 서버 버전으로 로컬 테이블을 업데이트하는 것입니다

여기 내 코드입니다.

내 문제 :

이것은 작동하지 않습니다. 로컬 사본은 변경되지 않습니다. 그것은 로컬 버전에 남아 있습니다.

도와 주시겠습니까?

+1

conflictError가 발생하는 것으로부터 나는 conflictError = null 때문에 do/while 루프를 종료하지 않을 것입니다. 루프 외부에서만 호출됩니다. 당신은 명확히 할 수 있습니까? –

+0

네, 좀 이상해 보입니다. 그러나 마이크로 소프트와 루프의 공식 사례가 효과가있다. 내 문제는 localTable.UpdateAsync (serverItem);을 기다리고 있습니다. 작동하지 않습니다 – OPunktSchmidt

+0

"공식 샘플"은 어디에 있습니까? 링크를 제공 할 수 있습니까? localTable이 변경되지 않는다는 것을 어떻게 알 수 있습니까? UI를 기반으로하거나 브레이크 포인트의 데이터를 볼 수 있습니까? 또한 UpdateAsync에는 매개 변수로 충돌을 제공 할 수있는 버전이 오버로드되었습니다. 너 그거 해봤 니? –

답변

1

동일한 엔지니어가 여기에 완전한 예제 인 Azure Mobile Services - Handling Conflicts with Offline을 가지고 있습니다. 충돌이있을 때의 if 블록 내부

await localTable.UpdateAsync(serverItem); 

: 레코드의 서버 버전을 유지하기 위해

,이 라인을 교체합니다.

+0

가능한 빨리 시도하십시오. 고맙습니다 – OPunktSchmidt

관련 문제