我试图弄清楚是否可以使用 ReactiveSwift 和 RAC5 实现适合我需要的网络请求处理。
在从 RACSignal 迁移到 ReactiveSwift 或 RAC5主题下,有人告诉我它可以使用 SignalProducer 完成,但深入研究它并没有给我预期的结果
所以,我想要:
1. 每次 textField 发送请求中的文本更改(按关键字搜索)。
2.一旦用户关闭当前的ViewController,当前的请求应该会自动取消
3.一旦关键字改变,可以取消请求
这是我所拥有的
self.textField.reactive.continuousTextValues.skipNil().filter({ (value) -> Bool in
return value.characters.count > 0
}).observeValues { [unowned self] (value) in
self.fetchSignalDisposable?.dispose()
self.fetchSignal = self.producerFor(keyword: value).on(started: {
print("started")
}, failed: { (error) in
print("error")
}, completed: {
print("completed")
}, value: { [unowned self] (items) in
print("value")
self.items.append(contentsOf: items)
self.tableView.reloadData()
})
self.fetchSignalDisposable = self.fetchSignal!.start()
}
这是生产者初始化程序
return SignalProducer<Any, NSError> { (observer, disposable) in
let task: URLSessionDataTask? = NetworkClient.fetchRequestWith(uri: "test", parameters: ["keyword" : keyword], success: { response in
observer.send(value: response)
observer.sendCompleted()
}, failure: { error in
observer.send(error: error)
observer.sendCompleted()
})
disposable += {
task?.cancel()
}
}
注意:
1. 有时我想有一个“两个处理程序块”,它会在成功和错误时被调用,所以像隐藏加载指示器这样的事情可以在那个块下完成。
这里有几个问题/问题:
1. 一旦我关闭 VC(解除操作),observeValue 处理程序就会再调用一次。它可以通过添加来修复.skipRepeats()
,但我想这只是一种解决方法,而不是一个确切的解决方案。
如果我关闭 VC 2 completed
,即使我在调用 3 后立即手动调用它,我也不希望这个观察者处于活动状态send(error: error)
。如果请求仍在加载并且我关闭 VC,它不会自动处理,这对我来说看起来很奇怪。我认为一旦 viewController 失去对 signalProducer 的引用,就会自动调用 dispose 块。即使调用VCself.fetchSignalDisposable?.dispose()
的deinit
方法也不会取消请求。它仍然完成请求和调用value
导致错误访问错误崩溃的处理程序
我的个人需求是:
1. 在请求成功和失败的情况下都将调用某种“两者”块2. 关闭 VC
3
后,必须删除 textFields 文本值的所有观察者,并且不再处于活动状态。
关闭VC时必须立即取消网络请求
PS:当然,感谢所有阅读这篇巨文并花时间帮助我的人!