2017-08-16 34 views
3

所以,在iOS开发,我使用ReactiveCocoa,并与框架我能够观察多个NSObjects并结合成一个signal返回一个值。事情是这样的:地图多LiveData值到一个

-(RACSignal *)modelIsValidSignal { 

    return [RACSignal combineLatest:@[RACObserve(self,username), RACObserve(self,password), RACObserve(self, busyLoggingIn)] 
          reduce:^id(NSString *username, NSString *password, NSNumber *busyLoggingIn) { 
           return @((username.length > 0) && (password.length > 0 && busyLoggingIn.boolValue == NO)); 
          }]; 
} 

所以,这将返回一个boolean要么是假性还是真性。只要其中一个对象状态发生变化,就会通知此信号,然后subscriber (Observer)将获得该布尔值的当前值。

如何使用LiveData来做类似的事情?最接近这样做的是MediatorLiveData,但是,我没有看到我怎么能同时观察多个LiveData事件,然后减少它,就像在上面的例子中一样。

+0

'LiveData'设计用于相当简单的场景。如果你需要这样的东西,使用RxJava。 – CommonsWare

+0

我有点担心,将RxJava加入混音中;因为我试图依靠第三方库依赖。那么,你说这是不可能的,LiveData? – Tander

+0

“我试图依赖第三方库的依赖关系 - ”LiveData“来自一个库。所有的Android开发都依赖于库。几乎所有的现代软件开发都依赖于库。 “那么,你说这是不可能的,用LiveData?” - 没有什么“开箱即可”这样做。 'MediatorLiveData'支持N个来源,所以你可能能够做出你想要的变换。我的观点是Google已经表明RxJava是复杂的反应流动的答案。 – CommonsWare

回答

0

我已经犯了这样的

var firstName: MutableLiveData<String> = MutableLiveData() 
var lastName: MutableLiveData<String> = MutableLiveData() 

var personalDetailsValid: MediatorLiveData<Boolean> = MediatorLiveData() 

personalDetailsValid.addSource(firstName, { 
    personalDetailsValid.value = lastName.value?.isNotBlank() == true && it?.isNotBlank() ?: false 
}) 

personalDetailsValid.addSource(lastName, { 
    personalDetailsValid.value = firstName.value?.isNotBlank() == true && it?.isNotBlank() ?: false 
}) 

一些验证然后我看到通常的方式

viewModel.personalDetailsValid.observe(this, Observer { 
     if (it == true) { 
      //Do something 
     } 
    }) 

我不知道这是否是使用LiveData和MediatorLiveData推荐的方式,但它的工作原理为了我。