我是关于RxSwift的新手,在我的情况下,我想使用UserDefaults和RxSwift来简化我的代码,所以我按照代码执行了这个
我的问题是,当我点击一个单元格,但订阅方法提交两次?那我该怎么做才能修好呢?很多!
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
class ViewController: UIViewController {
let disposeBag = DisposeBag()
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.register(UITableViewCell.self, forCellReuseIdentifier: String(describing: UITableViewCell.self))
tableView.rx
.itemSelected
.subscribe { (indexPath) in
UserDefaults.standard.set("\(indexPath)", forKey: "key")
}
.disposed(by: disposeBag)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
UserDefaults.standard.rx
.observe(String.self, "key")
// .debug()
.subscribe(onNext: { (value) in
if let value = value {
print(value)
}
})
.disposed(by: disposeBag)
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, String>>()
dataSource.configureCell = { (dataSource, tableView, indexPath, item) in
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UITableViewCell.self), for: indexPath)
cell.textLabel?.text = item
return cell
}
Observable.just([SectionModel(model: "", items: (0..<5).map({ "\($0)" }))])
.bindTo(tableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
答案 0 :(得分:4)
确实是某种错误,我建议使用distinctUntilChanged()
。
按照@wisper的建议使用debounce()
可能大部分时间都可以工作但是很危险,因为你依赖于observable发出的事件的速度。
答案 1 :(得分:0)
iOS bug,v10.2
UserDefaults.standard.rx
.observe(String.self, "key")
+ .debounce(0.1, scheduler: MainScheduler.asyncInstance)
...
答案 2 :(得分:0)
您可以尝试使用take(n),其中“ n”是可观察序列中连续元素的数量。
tableView.rx
.itemSelected
.take(1)
.subscribe { (indexPath) in
UserDefaults.standard.set("\(indexPath)", forKey: "key")
}
.disposed(by: disposeBag)
答案 3 :(得分:0)
如果您只想确保它在您的场景中只发出一次,请按照其他人的建议使用 distinctUntilChanged()
。请注意,如果您点击同一个单元格两次,您的 subscribe
闭包只会发出一次。
如果您想更好地了解它为什么发出两次,我会检查 didSet
上的 tableView
是否被调用两次。你可以试试移动这个块
tableView.rx
.itemSelected
.subscribe { (indexPath) in
UserDefaults.standard.set("\(indexPath)", forKey: "key")
}
.disposed(by: disposeBag)
转到viewDidLoad()
,看看您是否有同样的问题。