gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:37:21 24 4
gpt4 key购买 nike

好吧,我对响应式编程还很陌生。问题是,我有一个函数(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/

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