2016-04-05 4 views
0

Facebook apiのラッパーを作成してログインし、ログインしてください。 私のAPIで、私はRXフローの他のステップでのオブザーバブルからの再利用の結果

  1. facebookでログイン、
  2. 私のAPIを使用してログイン彼女のfacebook id
  3. 更新ユーザーに必要です。

CustomerRepositoryメソッドとFacebookRepositoryメソッドはすべてObservablesを返します。

だから最初に私はmFacebookRepository.startLoginFlow()を使ってfbでユーザーにログインします。

この結果は、mCustomerRepository.loginWithFacebookmCustomerRepository.updateFacebookIdで使用されるFacebookユーザーですが、loginWithFacebookが動作した場合にのみ呼び出される必要があります。

私は外部最終配列を使用しようとしましたが、本当に悪いです。

final String[] facebookUserId = new String[1]; Subscription subscription = mFacebookRepository.startLoginFlow() .compose(applyIoSchedulers()) .switchMap(user -> { facebookUserId[0] = user.getId(); // Save it for reuse later :( mCustomerRepository.loginWithFacebook(user); }) .switchMap(session -> mCustomerRepository.getCurrent()) .switchMap(customer -> mCustomerRepository.updateFacebookId(customer, facebookUserId[0]) // Reused here) .subscribe(user -> { mView.dismissProgress(); mView.startLoggedView(); mView.close(); }, error -> { mView.dismissProgress(); manageErrorFlow(error); });

どのように私は、複数の加入者とFacebookのユーザーIDを共有することができますか?

答えて

1

残念ながら、私はfacebook SDK + Rxで作業していませんが、コードの動作を再現する偽のオブジェクトや関数を作成しました。

してください、見て、何か助けが必要な場合は私に知らせて:

public static class FacebookCredential{ 
    public FacebookCredential(User u, Device device){}; 
} 
public static class Device{ 
} 
public static class Session{ 
} 
public static class Customer{ 
} 

public Device loadDeviceToken(){ 
    return null; 
} 

public Session loginWithFacebook(){ 
    return null; 
} 

public Customer getCurrent(){ 
    return null; 
} 

public User updateFacebookId(Customer c, String userId){ 
    return null; 
} 

private void test(){ 
    Observable.just(new User()) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .flatMap(new Func1<User, Observable<User>>() { 
       @Override 
       public Observable<User> call(final User user) { 
        return Observable.just(loadDeviceToken()) 
          .map(new Func1<Device, FacebookCredential>() { 
           @Override 
           public FacebookCredential call(Device device) { 
            return new FacebookCredential(user, device); 
           } 
          }) 
          .map(new Func1<FacebookCredential, Session>() { 
           @Override 
           public Session call(FacebookCredential facebookCredential) { 
            return loginWithFacebook(); 
           } 
          }) 
          .map(new Func1<Session, Customer>() { 
           @Override 
           public Customer call(Session session) { 
            return getCurrent(); 
           } 
          }) 
          .map(new Func1<Customer, User>() { 
           @Override 
           public User call(Customer customer) { 
            return updateFacebookId(customer, user.getId()); 
           } 
          }); 

       } 
      }).subscribe(/*...*/); 
} 

またはラムダを使用して:

public static class FacebookCredential{ 
    public FacebookCredential(User u, Device device){}; 
} 
public static class Device{ 
} 
public static class Session{ 
} 
public static class Customer{ 
} 

public Device loadDeviceToken(){ 
    return null; 
} 

public Session loginWithFacebook(){ 
    return null; 
} 

public Customer getCurrent(){ 
    return null; 
} 

public User updateFacebookId(Customer c, String userId){ 
    return null; 
} 

private void test(){ 
    Observable.just(new User()) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .flatMap(user -> Observable.just(loadDeviceToken()) 
        .map(device -> new FacebookCredential(user, device)) 
        .map(facebookCredential -> loginWithFacebook()) 
        .map(session -> getCurrent()) 
        .map(customer -> updateFacebookId(customer, user.getId()))).subscribe(/*...*/); 
} 
+0

が、混乱をtheresの、ユーザーが顧客、Facebookのと同じではありません私にユーザーを与えて、そのユーザーを使って複数のことをするが、チェーンのさまざまなステップでそれを使う方法は? – Caipivara

+0

@danielgomezrico、わかりますように、私のコードでは、ユーザーは顧客と同じではありません。 私は 'user'オブジェクトをコードに含めませんでした。 実際には、上記のコードでは、チェーンのさまざまなステップで 'User'オブジェクトを使用することができますが、何を意味するのか分かりません。 '.map(デバイス - >新しいFacebookCredential(ユーザ、デバイス))'と '.map(customer - > updateFacebookId(customer、user.getId()))の は、このコードはあなたのために働くはずです。 – Alexander

+0

@danielgomezricoちょうど私の偽の機能とオブジェクトをフェイスブックから特定のものに置き換えてください。 – Alexander

関連する問題