我使用3个api来获取tableview的数据。首先,feedRepository.findOtherFeed
返回包含数据数组和Bool的元组的Observable。对于数据数组中的每个元素,我调用userRepository.findProfileImg
来获取每个数据的配置文件图像。每个数据都有一个名为userFeed.imageIdList
的属性,对于每个id,我调用feedRepository.findFeedImage
来获取数据的图像。
这些数据将显示在tableView中。我想尽快向用户显示,这意味着我不能等待所有数据的imageIdList调用feedRepository.findFeedImage
。每当userRepository.findProfileImg
完成时,我想首先向用户显示我所得到的,然后当feedRepository.findFeedImage
完成时,我想更新数据。
我不是很流利地使用RxSwift,所以我正在努力实现它。
private func fetchAndProcessFeedsFinal(setSortOption: SortOption, page: Int?) -> Observable<Mutation> {
if page != nil {
resetPagination()
} else if isLastPage {
return .empty()
} else {
pages += 1
}
let nickname = "lemon""
return feedRepository.findOtherFeed(request: FindOtherFeedRequest(nickname: nickname, date: requestDate, page: pages, size: 7))
.flatMap { [weak self] (userFeeds, isLast) -> Observable<Mutation> in
guard let self = self else { return .empty() }
isLastPage = isLast
if userFeeds.isEmpty { return Observable.just(.updateDataSource([])) }
// MARK: inside processFeedWithProfileImage function it calls findProfileImg
let observables: [Observable<UserFeedSection.Item>] = userFeeds.map {[weak self] feed in
guard let self = self else { return Observable.just(.feed(FeedReactor(userFeed: feed, feedRepository: FeedRepository(), userRepository: UserRepository()))) }
return processFeedWithProfileImage(feed)
}
let feedWithImage = userFeeds.flatMap { userFeed in
userFeed.imageIdList.map { [weak self] imageId in
return self?.feedRepository.findFeedImage(request: FindFeedImageRequest(imageId: imageId))
}
}
return Observable.zip(observables)
.map { items in
return Mutation.updateDataSource(items)
}
}
}
字符串
我试过压缩和组合最新的,但我认为我没有使用它的正确方法..
2条答案
按热度按时间vsikbqxv1#
这是一个相当复杂的问题,特别是因为分页。您的示例中没有足够的信息来处理完整的问题。
下面是我如何使用我的CLE system来做类似的事情。
其基本思想如下:
然后,我们的想法是遵循
example(api:tableView:)
函数的输出。每当有页面或图像进入时,状态就会更新。它的items
数组将包含迄今为止下载的所有UserFeed以及CellDisplayable
对象中每个userFeed对象的所有图像。字符串
oxalkeyp2#
这是一个不需要反馈系统的答案,但它只能下拉一个页面。你必须更新它才能下拉其他页面。
这个想法的关键是
merge
的使用(你不想使用zip
或combineLatest
)。在每个网络请求完成后,Observable结果将发出一个数组,包含到目前为止为所讨论的页面检索到的所有信息。字符串