Sta*_*nov 5 ios reactive-cocoa racsignal swift reactive-swift
我正在尝试使用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()
}
Run Code Online (Sandbox Code Playgroud)
这是生产者初始化器
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()
}
}
Run Code Online (Sandbox Code Playgroud)
注意:
1.有时候我想要在成功和错误上调用"两个处理程序块",因此隐藏加载指示符之类的东西可以在该块下完成.
这里几个问题/问题:
1.一旦我关闭VC(解除动作),再次调用observeValue处理程序.它可以通过添加来修复.skipRepeats(),但我想这只是一种解决方法,而不是一个精确的解决方案.我希望不再让这个观察者活动,如果我关闭VC
2. completed在出现错误的情况下没有调用阻塞,即使我在调用send(error: error)
3 之后立即手动调用它.如果请求仍在加载并且我关闭VC,则它没有得到设置自动,它看起来很奇怪,我.我认为一旦viewController失去对signalProducer的引用,就会自动调用dispose block.即使self.fetchSignalDisposable?.dispose()在deinitVC方法中调用也不会取消请求.它仍然完成请求并调用value处理程序,导致Bad Access错误崩溃
我的个人需求是:
1.在成功和失败的请求案例
2 之后有一些"两个"块.在关闭VC
3 后,必须删除所有textFields文本值的观察者并且不再处于活动状态.我关闭VC时必须取消网络请求
PS:当然,感谢大家阅读这篇文章,并花时间帮助我!
ReactiveSwift 自述文件中的“发出网络请求”示例是此类事情的一个很好的示例。不是observeValues在你的文本字段信号上使用,通常你会使用.flatMap(.latest)它直接连接到你的 SignalProducer 像这样(注意我没有检查过这段代码,但希望它能够理解这个想法):
self.textField.reactive.continuousTextValues
.skipNil()
.filter { (value) -> Bool in
return value.characters.count > 0
}
.flatMap(.latest) { [unowned self] value in
return self.producerFor(keyword: value)
// Handling the error here prevents errors from terminating
// the outer signal. Now a request can fail while allowing
// subsequent requests to continue.
.flatMapError { error in
print("Network error occurred: \(error)")
return SignalProducer.empty
}
}
.observe(on: UIScheduler())
.observe { [unowned self] event in
switch event {
case let .value(items):
print("value")
self.items.append(contentsOf: items)
self.tableView.reloadData()
case let .failed(error):
print("error")
case .completed, .interrupted:
print("completed")
}
}
Run Code Online (Sandbox Code Playgroud)
指定.latest会导致在新的网络请求开始时自动取消先前的网络请求,因此无需在全局变量中跟踪当前请求。
至于管理生命周期,如果不了解更广泛的代码结构,很难说什么是最好的。通常,我会.take(during: self.reactive.lifetime)在self取消分配时向我的信号添加类似内容以终止订阅,可能就在调用observe.
错误事件终止信号。发生错误后无需发送完成的事件,无论如何观察者都不会看到它。基本上,完成表示信号成功终止,而错误表示信号以失败终止。
| 归档时间: |
|
| 查看次数: |
1426 次 |
| 最近记录: |