我试图弄清楚是否可以使用 ReactiveSwift 和 RAC5 来实现适合我需求的网络请求处理。
在主题下从 RACSignal 迁移到 ReactiveSwift 或 RAC5 https://stackoverflow.com/questions/43476727/migrate-from-racsignal-to-reactiveswift-or-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()
}
}
Notes:
1.有时我想要有一种“两个处理程序块”,在成功和错误时都会被调用,因此可以在该块下完成诸如隐藏加载指示器之类的事情。
这里有几个问题/疑问:
1. 一旦我关闭 VC(关闭操作),observeValue 处理程序就会再次被调用。可以通过添加来修复.skipRepeats()
,但我想这只是一个解决方法,而不是一个确切的解决方案。如果我关闭 VC,我不想再让这个观察者处于活动状态
2. completed
发生错误时不会调用块,即使我在调用后立即手动调用它send(error: error)
3.如果请求仍在加载并且我关闭了VC,则它不会被处理自动地,这对我来说看起来很奇怪。我认为一旦 viewController 失去对 signalProducer 的引用,dispose 块就会被自动调用。甚至打电话self.fetchSignalDisposable?.dispose()
in deinit
VC 的方法不会取消请求。它仍然完成请求并调用value
导致崩溃并出现错误访问错误的处理程序
我个人的需求是:
1. 有某种“两者”块,在请求成功和失败后都会调用
2. 一旦我关闭 VC,文本字段文本值的所有观察者都必须被删除并且不再处于活动状态
3.关闭VC时必须立即取消网络请求
P.S.:当然,感谢所有阅读这篇长文并花时间帮助我的人!