Completable 必须在 observable 的 on next 被触发时完成
Completable must complete when an observable's on next is fired
我有一个 Observable
如下:
public Observable<List<Object>> getObjectsForUser() {
return Observable.fromCallable(() -> {
if (objects.size() < 1) {
List<ObjectDto> dtos = dataSource.getAllForUser();
if (dtos != null) {
objects = objectMapper.toDomain(dtos);
}
}
return objects;
}).subscribeOn(Schedulers.io());
}
这样使用的:
public Completable refreshOtherObjects() { // How do I return a completable which completes when the code in this lambda Observer has finished execution?
objectRepository.getObjectsForUser().subscribe(objects -> {
for (Object object: objects) {
List<OtherObjectDto> dtos = dataSource.getOtherObjects(object.getId());
if (dtos != null) {
otherObjectDao.upsertOtherObjects(mapper.toEntity(dtos));
}
}
});
}
我的问题是:
我如何 return 当最后描述的方法中的 lambda Observer 中的代码完成执行时完成的可完成项?
不是在 refreshOtherObjects
内嵌套 subscribe
调用,而是通过在 .doOnNext
调用内完成该工作来继续 Rx 链,然后将链转换为 Completable
使用 ignoreElements()
运算符:
public Completable refreshOtherObjects() { // How do I return a completable which completes when the code in this lambda Observer has finished execution?
return objectRepository.getObjectsForUser()
.doOnNext(objects -> {
for (Object object: objects) {
List<OtherObjectDto> dtos = dataSource.getOtherObjects(object.getId());
if (dtos != null) {
otherObjectDao.upsertOtherObjects(mapper.toEntity(dtos));
}
}
})
.ignoreElements();
}
我有一个 Observable
如下:
public Observable<List<Object>> getObjectsForUser() {
return Observable.fromCallable(() -> {
if (objects.size() < 1) {
List<ObjectDto> dtos = dataSource.getAllForUser();
if (dtos != null) {
objects = objectMapper.toDomain(dtos);
}
}
return objects;
}).subscribeOn(Schedulers.io());
}
这样使用的:
public Completable refreshOtherObjects() { // How do I return a completable which completes when the code in this lambda Observer has finished execution?
objectRepository.getObjectsForUser().subscribe(objects -> {
for (Object object: objects) {
List<OtherObjectDto> dtos = dataSource.getOtherObjects(object.getId());
if (dtos != null) {
otherObjectDao.upsertOtherObjects(mapper.toEntity(dtos));
}
}
});
}
我的问题是:
我如何 return 当最后描述的方法中的 lambda Observer 中的代码完成执行时完成的可完成项?
不是在 refreshOtherObjects
内嵌套 subscribe
调用,而是通过在 .doOnNext
调用内完成该工作来继续 Rx 链,然后将链转换为 Completable
使用 ignoreElements()
运算符:
public Completable refreshOtherObjects() { // How do I return a completable which completes when the code in this lambda Observer has finished execution?
return objectRepository.getObjectsForUser()
.doOnNext(objects -> {
for (Object object: objects) {
List<OtherObjectDto> dtos = dataSource.getOtherObjects(object.getId());
if (dtos != null) {
otherObjectDao.upsertOtherObjects(mapper.toEntity(dtos));
}
}
})
.ignoreElements();
}