首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Single.defer()未执行

Single.defer()未执行
EN

Stack Overflow用户
提问于 2018-01-08 08:24:39
回答 1查看 1.1K关注 0票数 2

我有一个问题,我的Single.defer块没有被执行。

调用documentRepository.getDocuments()是为了从DB获取文档:

代码语言:javascript
运行
复制
class GetReports
@Inject constructor(
        private val reportRepository: ReportRepository,
        private val documentRepository: DocumentRepository,
        threadExecutor: ThreadExecutor,
        postExecutionThread: PostExecutionThread
) : SingleUseCase<List<Report>, Void?>(
        threadExecutor, postExecutionThread) {

    override fun buildUseCaseObservable(params: Void?): Single<List<Report>> {
        return reportRepository
                .getReports()
                .flatMap { reports ->
                    val finalReports = ArrayList<Report>()

                    reports.forEach { report ->
                        documentRepository.getDocuments(report.id!!)
                                .map { documents ->
                                    finalReports.add(Report(report.id, report.name, report.status,
                                            report.dateCreated, documents))
                                }
                    }

                    Single.just(finalReports.toList())
                }
    }

}

第一个Timber.d()日志代码被执行,所以我知道它进入了这个方法,但是之后的整个Single.defer代码没有被执行--调试没有进入块内部,第二个Timber.d()日志代码也没有被执行。

代码语言:javascript
运行
复制
override fun getDocuments(reportId: Long): Single<List<Document>> {
        Timber.d("Getting documents for report ID $reportId")

        return Single.defer<List<Document>> {
            try {
                Timber.d("Getting document cursor for report ID $reportId")
                val documentCursor = database.query(
                        Db.DocumentTable.TABLE_NAME,
                        null,
                        Db.DocumentTable.REPORT_ID + "= $reportId",
                        null,
                        null,
                        null,
                        null
                )
                Timber.d("Got document cursor for report ID $reportId. Row count: ${documentCursor.count}")
                getDocuments(documentCursor)
            } catch (e: Exception) {
                Timber.e(e, "Error getting documents for report ID $reportId")
                Single.error(e)
            }
        }
    }

我做得不对吗?任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-08 08:59:00

正如@azizbekian所说,没有任何东西可以订阅getDocuments。但是,不鼓励在该subscribe()内部调用flatMap,因为它破坏了流。相反,您应该创建一个内部流并在报表的flatMap中返回该流:

代码语言:javascript
运行
复制
override fun buildUseCaseObservable(params: Void?): Single<List<Report>> {
    return reportRepository
            .getReports()
            .flatMap { reports ->
                Observable.fromIterable(reports)
                .concatMap { report ->
                    documentRepository.getDocuments(report.id!!) 
                    .map { documents ->
                         Report(report.id, report.name, report.status,
                                 report.dateCreated, documents))
                    }.toObservable()
                }
                .toList()
            }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48146529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档