我希望将一个项目列表映射到observables,然后将每个可观察项目flatmap与另一个函数一起处理,以便将一些REST API调用的结果保存到数据库中。
API调用正确返回所有项目。但是,flatMapIterable并没有将所有项目传递给最后一个flatMap。
这是代码。
restApi.getContacts(user)
.flatMapIterable(new Func1<List<Contact>, List<Contact>>() {
@Override
public List<Contact> call(List<Contact> contacts) {
return contacts;
}
}
.flatMap(new Func1<Contact, Observable<Integer>>() {
@Override
public Observable<Integer> call(Contact Contact) {
return create(Contact);
}
})
我不想使用doOnEach或doOnNext,我的问题是关于flatMapIterable的行为。
为什么我无法覆盖上一个flatmap中的所有项目?
感谢。
答案 0 :(得分:1)
首先,仅供检查,请尝试以下
而不是:
.flatMap(new Func1<List<Contact>, Observable<Contact>>() {
@Override
public Observable<Contact> call(List<Contact> contacts) {
return Observable.from(contacts);
}
})
试试这个:
restApi.getContacts(user)
.doOnNext(new Action1<List<Contact>>() {
@Override
public void call(List<Contact> contacts) {
Log.i(LOG_TAG, "first doOnNext size: " + contacts.size());
}
})
.flatMapIterable(new Func1<List<Contact>, List<Contact>>() {
@Override
public List<Contact> call(List<Contact> contacts) {
Log.i(LOG_TAG, "flatMapIterable size: " + contacts.size());
return contacts;
}
})
.flatMap(new Func1<Contact, Observable<Integer>>() {
@Override
public Observable<Integer> call(Contact Contact) {
return create(Contact);
}
})
.toList()
.doOnNext(new Action1<List<Integer>>() {
@Override
public void call(List<Integer> integers) {
Log.i(LOG_TAG, "second doOnNext size: " + contacts.size());
}
})
如果无效,请添加以下代码:
{{1}}
并在此处打印Logcat输出。