【发布时间】:2017-04-25 17:58:48
【问题描述】:
我正在尝试寻找最佳实践来处理从父请求中获得的每个值的多个子请求。我正在尝试使用与此处相同的逻辑 - Reactive Cocoa 5 and ReactiveSwift network requests handling,但有一些问题。
我们拥有和需要什么:
1.带有无限滚动处理程序的 TableView (SVPullToRefresh)
2.每次调用处理程序时获取对象列表
3.从响应中为每个对象发送“子请求”
注意事项:
1. 一旦 viewController 关闭(调用 deinit),所有请求(父 + 子请求)都应该被取消
2. 我需要有随时取消父请求的能力。这也应该取消所有子请求。
我目前拥有的
我知道我在“无限处理程序”中所做的有点像“胶带”,但我是 ReactiveSwift 的新手...
self.tableView.addInfiniteScrollingWithActionHandler { [unowned self] in
self.tempMutableProperty.value = true
}
self.tempMutableProperty.producer.skipNil().flatMap(.latest) { [unowned self] tempValueThatIDontNeed in
return self.producerForParentRequest(offset: self.offset)
.take(during: self.reactive.lifetime)
.on(
// handlers for errors, completed, etc
value: { [unowned self] items in
self.items.append(items)
self.tableView.reloadData()
self.offset += items.count
// SEND REQUEST #2 FOR EACH ITEM
}
).flatMapError { error in
return SignalProducer.empty
}
}.observe(on: UIScheduler().start()
所以,如您所见,我使用 tableView 进行分页。我正在为每个页面获取对象列表。然后对于响应中的每个项目,我需要使用请求 #2 获取附加信息。
流程和问题:
1.我当然想摆脱tempMutableProperty,并以某种方式开始新的parent request,而不需要某种代理2. 每个sub-request 应该是独立的,这意味着我希望为每个sub-request 分别调用value/error 处理程序,而不是等待所有10 个子请求然后调用成功处理程序并收集所有 10 个响应。此外,某些特定子请求的失败不应影响其他正在运行的子请求
3.用户可以更改他的搜索请求,而无需等待整个请求过程完成。这意味着一旦用户更改了某些参数,我将清除所有项目,并且我需要在所有sub-requests 中取消parent request 并重新开始这一切。
4. 除了# 2,有时用户可以向下滚动以获取新的项目部分。这意味着新的parent request 应该开始,但来自parent request 先前响应的sub-requests 应该继续工作
5. 所有请求都应该在self.deinit 上被取消,所以这一切应该只在self.lifetime 期间有效,但我不确定放置此参数的正确位置是什么
如果不将一次性/信号存储为 self 的属性,我不确定这一切是否可行,所以如果 sub-request 会以某种方式存储为属性,这不是问题。
谢谢大家的帮助
【问题讨论】:
标签: ios swift reactive-cocoa racsignal reactive-swift