gpt4 book ai didi

ios - RxSwift。订阅发生两次

转载 作者:行者123 更新时间:2023-11-29 05:26:01 25 4
gpt4 key购买 nike

我对 RxSwift 不太了解,无法自己解决我的问题。我将非常感谢您的帮助。对不起我的英语。

//declare variables    

var loadedImage = BehaviorRelay<UIImage?>(value: nil)

//Subscribe when creating a cell

loadedImage
.do(onNext: { (_) in
cell.activityIndicator.startAnimating()
cell.activityIndicator.isHidden = false
})
.flatMap { (image) -> Observable<String> in
guard let image = image else { return Observable.just("") }
return service.uploadPhoto(image: image)
}
.observeOn(MainScheduler.instance)
.subscribeNext { (imageName) in
vc.createEventData.imageName = imageName

cell.activityIndicator.stopAnimating()
cell.activityIndicator.isHidden = true

let currentPhoto = self.object?.placeholderPhoto
let image = self.loadedImage.value

cell.photoEventImageView.image = image == nil ? currentPhoto : image

if let photoPath = self.object?.photoPath, image == nil {
if photoPath != "uploads/photos/.png" {
let url = URL(string: "http://test-around.profsoft.online/" + photoPath)
cell.photoEventImageView.kf.setImage(with: url)

if let r = photoPath.range(of: "/", options: .backwards) {
let imageName = photoPath.substring(from: r.upperBound)
vc.createEventData.imageName = imageName
}
}
}

}
.disposed(by: disposeBag)

//I throw a signal when choosing a photo

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
guard let image = info[.originalImage] as? UIImage else { return }
loadedImage.accept(image)
self.viewController?.dismiss(animated: true, completion: nil)
}

我不明白为什么订阅会发生两次。也就是说,我去service.uploadPhoto(image: image)两次。

最佳答案

我只能根据您发布的代码进行推测,但当单元格被重用时您可能不会取消订阅。因此,由于当 cellForRowAtIndexPath 时 disposeBag 由 ViewController 持有接到电话后,您只需添加另一个订阅即可。只有在 ViewController 被释放后(也就是 DisposeBag 被销毁时),订阅才会被清除。

这是我现在要做的:单元格应该保存 Observable 和 DisposeBag。您必须在 prepareForReuse 中清除它。 :

class YourCell: UITableViewCell {
var disposeBag = DisposeBag()
var yourObservable: Observable<UIImage?>?

func configure(with yourObservable: Observable<UIImage?>) {
yourObservable = yourObservable
.subscribe(onNext: /*your code*/ }
.disposed(by: disposeBag)
}

override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
}

然后在你的 ViewController 中:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let observable = loadedImage /* additional config if needed */
let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR IDENTIFIER HERE", for: indexPath) as! YourCell
cell.configure(with: observable)
return cell
}

此时您可能还需要考虑您的架构。例如,您可以管理为单元格提供数据的可观察对象,以便您可以将其绑定(bind)到 TableView 并让 rx 管理一切。或者,您可以以单元格可以完全自行处理自己的 ViewModel 的方式重写 TableViewDataSource。

关于ios - RxSwift。订阅发生两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58164818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com