ios - ReactiveCocoa 5, ReactiveSwift 网络子请求处理 & 最佳实践

标签 ios swift reactive-cocoa racsignal reactive-swift

我正在尝试寻找最佳实践来处理从父请求中获取的每个值的多个子请求。我正在尝试使用与此处相同的逻辑 - Reactive Cocoa 5 and ReactiveSwift network requests handling , 但有一些问题。

我们拥有和需要的东西:
1。具有无限滚动处理程序 (SVPullToRefresh) 的 TableView
2。每次调用处理程序时获取对象列表
3。为响应中的每个对象发送“子请求”

注意事项:
1. 一旦 viewController 关闭(调用 deinit),所有请求(父请求 + 子请求)都应该被取消
2. 我需要有能力随时取消 parent 的请求。这也应该取消所有子请求。

我目前拥有的

我知道我在“无限处理程序”中所做的有点像“胶带”,但我是 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. 每个子请求 应该是独立的,这意味着我想为每个子请求调用value/error 处理程序 分开,不像它等待所有 10 个子请求,然后调用成功处理程序并收集所有 10 个响应。此外,某些特定子请求的失败不应影响其他正在运行的子请求
3. 用户可以更改他的搜索请求,而无需等待整个请求过程完成。这意味着一旦用户更改了某些参数,我将清除所有项目,并且我需要取消所有子请求中的parent request并重新开始。
4. 除了#2,有时用户可以向下滚动以获取项目的新部分。这将意味着新的父请求应该开始,但是来自父请求的先前响应的子请求应该继续工作
5. 所有请求都应该在 self.deinit 时被取消,所以这一切应该只在 self.lifetime 期间有效,但我不确定放置此参数的正确位置是什么

我不确定如果不将一次性/信号存储为自身的属性,这一切是否可行,所以如果 sub-request 将以某种方式存储为属性,这不是问题。


谢谢大家的帮助

最佳答案

对于第 1 部分,我将添加一个扩展,将无限滚动操作处理转换为信号:

extension Reactive where Base: UITableView {
    public func infiniteScrollingSignal() -> Signal<Void, NoError>
    {
        return Signal { [unowned base = self.base] observer in
            base.addInfiniteScrollingWithActionHandler  {
                observer.send(value: ())
            }

            return ActionDisposable {
                // Unsubscribe the infinite scrolling action handler here if necessary
            }
        }
        .take(during: self.lifetime)
    }
}

然后您可以将所有逻辑连接到 self.tableView.reactive.infiniteScrollingSignal()

关于ios - ReactiveCocoa 5, ReactiveSwift 网络子请求处理 & 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43617865/

相关文章:

ios - 我可以在 ViewDidLoad 中加载 UICollectionView 的数据吗?

ios - Font Awesome Swift : "Ambiguous Use of Code"

swift - searchBarController 搜索时不跟随文本,取消不起作用

ios - 即使有缓存也无法正确加载图像

ios - 仅对新订阅者进行信号重试

reactive-cocoa - 是否有像发布这样的 ReactiveCocoa 方法,但它将最新值转发给新订阅者?

ios - 如何使用 Reactive Cocoa 以正确的方式链接信号?

ios - MapView 检测滚动

ios - 备份和恢复一个 Core Data SQLite(核心数据)

ios - Storyboard中不同的导航栏高度