Return Observer.create不返回,并且旁边的代码无法使用RxSwift运行

问题描述 投票:0回答:1

嗯,我对反应式编程非常陌生。问题是,我有一个返回对象的函数(A),现在我有另一个函数(B)订阅了从函数A返回的对象,我也使函数B也成为了该订阅中返回的另一个对象,现在整个返回这个是行不通的。我不知道为什么会这样。任何帮助,将不胜感激。谢谢功能A

func getClassById(classId: Int) -> Observable<AssignedClassModel> {
    return Observable.create{[weak self] observer -> Disposable in            Alamofire.request("URL", method:.get, parameters: nil, encoding: JSONEncoding.default, headers: self!.getRequestHeader())
            .validate()
            .responseJSON{ response in
                switch response.result {
                    do {
                        let assingnedClass = try JSONDecoder().decode(AssignedClassModel.self, from: data)
                        observer.onNext(assingnedClass)
                    } catch {
                        observer.onError(error)
                    }
                case .failure(let error):
                    observer.onError(error)
                }
        }
        return Disposables.create()
    }
}

功能B

func getAssignedClassData(classId: Int) -> Observable<[StudentModel]>  { 
    return Observable.create{[weak self] observer -> Disposable in // from here code is not going further.
    APIService.singelton
        .getClassById(classId: classId)
        .asObservable()
        .subscribe(onNext: { [weak self] assingnedClass in
            let studentsData = Array(Database.singleton.fetchStudents(byCLassId: classId))
            print(studentsData)
            observer.onNext(studentsData)
            }, onError: { error in
                print(error)
        }).disposed(by: self!.disposeBag)
        return Disposables.create()
        }
}
ios swift reactive-programming rx-swift
1个回答
0
投票
  1. 不需要可观察的创建。函数B不需要返回新的observable。如果要将一个可观察的对象转换为另一个可观察的对象,可以使用map operator

  2. 错误处理问题。在函数B中,将捕获错误,但是Observable将永远不会完成。在我的示例中,我仅使用副作用来处理打印错误,因此错误将传播并且map将不会运行。但是map有一些策略。

  3. [功能B不需要error handling in RxSwift中的asObservable

getAssignedClassData在您的示例中未使用,可能实际代码已简化,因此功能B为:

assingnedClass
© www.soinside.com 2019 - 2024. All rights reserved.