ios - Return Observer.create 不返回并且旁边的代码不能使用 RxSwift 工作

标签 ios swift reactive-programming rx-swift

好吧,我对响应式编程还很陌生。问题是,我有一个函数(A)返回一个对象,现在我有另一个函数(B)订阅从函数 A 返回的对象,我让函数 B 也返回那个订阅中的另一个对象,现在整个返回这个是行不通的。我不知道为什么会这样。 任何帮助,将不胜感激。谢谢 函数A

func getClassById(classId: Int) -> Observable<Bool> {
    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(true)
                    } 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()
        }
}

函数B2

    func getAssignedClassData(classId: Int) -> Observable<[StudentModel]>  {
        return APIService.singelton
            .getClassById(classId: classId)
            .do(onError: { error in
                print(error)
            })
            .map({ [weak self] assingnedClass in
                return Array(Database.singleton.fetchStudents(byCLassId: classId))
// this code will not be triggered as it is after return. 
                let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "tabBarVC") as? TabBarViewController
                let transition = CATransition()
                transition.duration = 0.5
                transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
                transition.type = CATransitionType.fade
                self?.navigationController?.view.layer.add(transition, forKey: nil)
                self?.navigationController?.pushViewController(vc!, animated: true)

            })
    }

最佳答案

  1. 函数 B 中不需要创建 Observable。如果您想将一个 Observable 转换为另一个,您可以使用 map operator .

  2. Function B 中存在错误处理问题。错误会被捕获,但 Observable 永远不会完成。在我的示例中,我只使用了打印错误的副作用,因此错误将被传播并且 map 将不会运行。 error handling in RxSwift有一些策略.

  3. 函数 B 不需要 asObservable

  4. 未使用函数 A (assingnedClass) 的结果。可能真正的代码被简化了。

  5. 在函数 A 的 observer.onNext() 之后没有 observer.onCompleted()。您的 observable 不会及时完成和释放。

这是我的例子:

class StudentService {
    ...
    func getAssignedClassData(classId: Int) -> Observable<[StudentModel]> {
        return APIService.singelton
            .getClassById(classId: classId)
            .do(onError: { error in
                print(error)
            })
            .map { _ in Array(Database.singelton.fetchStudents(byCLassId: classId)) }
    }
}

class SomeController: UIViewController {
    ...
    func fetchStudentsAndPushViewController() {
        studentService
            .getAssignedClassData(classId: classId)
            .observeOn(MainScheduler.instance)
            .subscribe(onNext: { [weak self] _ in
                let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "tabBarVC") as? TabBarViewController
                let transition = CATransition()
                transition.duration = 0.5
                transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
                transition.type = CATransitionType.fade
                self?.navigationController?.view.layer.add(transition, forKey: nil)
                self?.navigationController?.pushViewController(vc!, animated: true)
            })
            .disposed(by: self!.disposeBag)
    }
}

顺便说一句。你可以试试RxAlamofire为你 APIService 所以你不需要自己将请求包装到 Observable 中。

关于ios - Return Observer.create 不返回并且旁边的代码不能使用 RxSwift 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58246679/

相关文章:

ios - 从另一个文件中的 SKScene 中删除 UIView

ios - KVO 通知间歇性崩溃

android - AppRTC:iOS到Android的通话无法正常工作

reactive-programming - 在 Rx.Net 中去抖直到

ios - dataSource 不会在 cellForItemAt 函数中更新

ios - 从自定义 View 加载表格单元格内容

ios - 通过使 UI 元素闪烁来指示错误

ios - 按需滚动不断调用

flutter - Flutter 中的分页/无限滚动,带缓存和实时失效

spring-boot - 如何使用 Spring Boot 实现高 TPS