Ios RxSwift。订阅发生两次

Ios RxSwift。订阅发生两次,ios,swift,rx-swift,Ios,Swift,Rx Swift,我对RxSwift不太了解,无法独自解决我的问题。我将非常感谢你的帮助。对不起我的英语 //declare variables var loadedImage = BehaviorRelay<UIImage?>(value: nil) //Subscribe when creating a cell loadedImage .do(onNext: { (_) in cell.activityIndicator.st

我对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两次。

我只能根据您发布的代码推测,但当手机被重新使用时,您可能不会取消订阅。因此,由于调用CellForRowatineXpath时disposeBag由ViewController持有,因此您只需添加另一个订阅即可。只有在解除分配ViewController后,即DisposeBag被销毁时,订阅才会被清除

我现在要做的是:细胞应该持有可观察的和处置的标记。您必须在“准备”中清除它,然后再使用:

将YourCell分类:UITableViewCell{ var disposeBag=disposeBag 可观察的:可观察的? func configurewith yourObservable:Observable{ yourObservable=yourObservable .subscribeonNext:/*您的代码*/} .处置人:处置人 } 覆盖函数准备就绪{ 超级准备 disposeBag=disposeBag } } 然后在ViewController中:

func tableView\utableview:UITableView,cellforrow在indexPath:indexPath->UITableView单元格{ 如果需要,让observable=LoadeImage/*附加配置*/ 让cell=tableView.dequeueReusableCellwithIdentifier:此处为您的标识符,for:indexPath as!YourCell cell.configurewith:可观察 返回单元 }
此时,您可能还想考虑一下您的体系结构。例如,您可以管理为单元格提供数据的可观察对象,这样您就可以将其绑定到tableview,并让rx管理所有内容。或者,您可以覆盖TableViewDataSource,使您的单元格可以完全自己处理自己的ViewModels。

您确定只在创建单元格时进行订阅,还是在重用单元格时也进行订阅?请在执行之前添加.debug以了解序列的生命周期。如果你看了两遍,那么丹尼尔是对的!