2016-04-05 2 views
0

Я сделал обертку для Facebook api, чтобы войти в систему и получить зарегистрированного пользователя. В моей апи мне нужноПовторное использование результатов Observables на другом этапе потока RX

  1. Войти с Facebook,
  2. вход с моим апи
  3. пользователя обновление с ее facebook id.

Все методы CustomerRepository и FacebookRepository возвращают Observables.

Итак, сначала я делаю mFacebookRepository.startLoginFlow(), чтобы войти в систему с помощью fb.

Результатом этого является пользователь Facebook, который будет использоваться mCustomerRepository.loginWithFacebook и mCustomerRepository.updateFacebookId, но этот номер следует называть, только если 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 идентификатор с более чем одного абонента?

ответ

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 (клиент -> updateFacebookId (customer, user.getId()))' И этот код должен работать на вас. – Alexander

+0

@ danielgomezrico просто заменит мои поддельные функции и объекты на определенные из фейсбуков, и он должен работать – Alexander

Смежные вопросы