2014-12-23 7 views
0

Parse SDK 및 Bolts 프레임 워크를 사용하여 등록 흐름을 구현하려고합니다. Bolts-android 문서 사용하기 소셜 네트워크에서 개인 정보를 가져 와서이 데이터로 새 ParseUser를 만들고 작업을 반환하는 작업을 만들었습니다. onSuccessTask() 메서드를 사용하여이 작업을 체인화하고 다른 작업을 반환하는 signUpInBackground() 메서드를 사용하여 구문 분석에 새 사용자를 등록하려고합니다. 후자는 onSuccess() 메소드 호출로 묶었는데, 여기에서 가입이 성공적으로 완료되었는지 확인한 다음 사용자를 다른 화면으로 진행합니다. 새 사용자가 모든 것을 등록하려고 할 때 ok - 사용자가 성공적으로 가입합니다. 문제는 서버에 사용자가 이미 존재하는 경우입니다. Parse는 코드 202로 ParseException을 반환해야하며 가입하려고하는 두 번째 작업은 오류 상태가있는 새 작업을 생성해야한다고 생각하지만 끝나지 않은 것처럼 보입니다.ParseUser.signUpInBackground()는 오류가 발생했을 때 무엇을 반환합니까?

Task 1 ended 
Task 2 ended 

:

private void loginUser() { 
    fetchUserTask() 
      .onSuccessTask(new Continuation<ParseUser, Task<Void>>() { 
       @Override 
       public Task<Void> then(Task<ParseUser> task) throws Exception { 
        if (task.isCompleted()) { 
         Log.d(EristicaConstants.LOG_TAG, "task1 ended"); 
         return task.getResult().signUpInBackground(); 
        } else { 
         Log.d(EristicaConstants.LOG_TAG, "some error happened " + task 
           .getError().getLocalizedMessage()); 
        } 
        return null; 
       } 
      }) 
      .onSuccess(new Continuation<Void, Void>() { 
       @Override 
       public Void then(Task<Void> task) throws Exception { 
        if (task.isCompleted()) { 
         Log.d(EristicaConstants.LOG_TAG, "task 2 ended"); 
         mSuccessCallback.success(); 
        } else { 
         Log.d(EristicaConstants.LOG_TAG, "some error happened 2" + task 
           .getError().getLocalizedMessage()); 
        } 
        return null; 
       } 
      }); 
} 

그래서 새로운 사용자의 경우 내가 로그이 순서를 참조하십시오이 내 로그인 방법은

private Task<ParseUser> fetchUserTask() { 
    final Task.TaskCompletionSource tcs = Task.create(); 
    mNetwork.requestDetailedCurrentPerson(new OnRequestDetailedSocialPersonCompleteListener() { 
     @Override 
     public void onRequestDetailedSocialPersonSuccess(int socialNetworkID, SocialPerson socialPerson) { 
      ParseUser user = new ParseUser(); 
      if (mNetworkId == VkSocialNetwork.ID) { 
       user.setUsername("vk" + socialPerson.id); 
      } else if (mNetworkId == FacebookSocialNetwork.ID) { 
       user.setUsername("fb" + socialPerson.id); 
      } 
      user.put("fullName", socialPerson.name); 
      user.put("photo", socialPerson.avatarURL); 
      tcs.setResult(user); 
     } 

     @Override 
     public void onError(int socialNetworkID, String requestID, String errorMessage, Object data) { 
      tcs.setError(new Exception(errorMessage)); 
     } 
    }); 
    return tcs.getTask(); 
} 

입니다 :

이것은 내 첫 번째 작업이다 하지만 기존 사용자의 경우 첫 번째 줄만 표시되므로 onSuccess() 전화 한 적 없어요. 물론 ParseUser.signUpInBackground (SignUpCallback 콜백)를 사용하고 콜백에 따라 새로운 Task를 생성 할 수 있지만 좀 더 못된 솔루션입니다. 그래서 문제는 signUpInBackground가 오류를 반환하지 않는 이유입니다.

+1

사용자가 로그인. 설명서에서'onSuccess'를'continueWith'로 대체해야한다는 것을 상기합니다. 나는 onSuccess가 단지 '트럭 운전을 계속하는'반면 continueWith는 이전 작업의 오류를 알고 있다고 생각합니다. 볼트 설명서 : https://github.com/BoltsFramework/Bolts-Android – cYrixmorten

+0

감사합니다.이 경우 "작업 2 종료"로그가 표시되지만 ParseUser.getCurrentUser()가 null을 생성합니다. 따라서 signUpInBackground가 task.isCompleted() 예외를 생성하면 모두 동일한 것으로 평가됩니다. –

+1

'continueWithTask'를 만들고'task.isFaulted()'를 확인하면 어떨까요? 볼트 설명서는 https://github.com/BoltsFramework/Bolts-Android#error-handling – cYrixmorten

답변

0

마지막으로 나는 작업의 체인을 가지고 : 몇 가지 오류가 나는 다른 작업을 만드는 두 번째 작업에서 가입의 실행 중에 발생하는 경우

private void loginUser() { 
    fetchUserTask() 
      .onSuccessTask(new Continuation<ParseUser, Task<Void>>() { 
       @Override 
       public Task<Void> then(Task<ParseUser> task) throws Exception { 
        if (task.isCompleted()) { 
         return task.getResult().signUpInBackground(); 
        } 
        return null; 
       } 
      }) 
      .continueWithTask(new Continuation<Void, Task<ParseUser>>() { 
       @Override 
       public Task<ParseUser> then(Task<Void> task) throws Exception { 
        if (task.isFaulted()) { 
         return ParseUser.logInInBackground(mUserId, PASSWORD); 
        } 
        return null; 
       } 
      }) 
      .continueWith(new Continuation<ParseUser, Object>() { 
       @Override 
       public Object then(Task<ParseUser> task) throws Exception { 
        if (task.isCompleted()) { 
         mSuccessCallback.success(); 
        } 
        return null; 
       } 
      }); 
} 

어디 다시 읽어 볼트를하지 않고