RXSwift:订阅者永远不会收到回电



我有这个功能:

func makeRepoRequest() -> Single<[String: Any]> {
return Single<[String: Any]>.create {[weak self] observer in
guard let something = self?.temp else {
let disposeBag = DisposeBag()
self?.getRepo("364").subscribe(onSuccess: { content in
observer(.success(content))
}, onError: { error in
observer(.error(error))
}).disposed(by: disposeBag)
return Disposables.create()
}
observer(.success(something))
return Disposables.create()
}
}

订阅此函数:

func getRepo(_ repo: String) -> Single<[String: Any]> {
return Single<[String: Any]>.create { single in
print(repo)
let url = "https://api.github.com/repositories?since=(repo)"
print(url)
let task = URLSession.shared.dataTask(with: URL(string:url)!) { data, _, error in
if let error = error {
single(.error(error))
return
}
guard let data = data,
let json = try? JSONSerialization.jsonObject(with: data, options: []),
let result = json as? [String: Any] else {
let error = NSError(domain: "Decoding", code: 0, userInfo: nil)
single(.error(error))
return
}
single(.success(result))
}
task.resume()
return Disposables.create()
}
}

但由于某种原因,订阅它永远不会收到回电。你们中的任何人都知道为什么订阅永远不会收到回电吗?

我真的很感激你的帮助。

您的makeRepoRequest()定义不正确。您在封盖内创建的一次性物品应该是您返回的一次性物品。那里不应该有任何 disposeBag,你还需要解开 self 并确保在 self 不存在时发出一些东西,如果你要保留一个temp缓存,你真的应该分配给它......

func makeRepoRequest() -> Single<[String: Any]> {
return Single<[String: Any]>.create { [weak self] observer in
guard let this = self else {
observer(.error(MyError.missingSelf))
return Disposables.create()
}
guard !this.temp.isEmpty else {
return this.getRepo("364").subscribe(onSuccess: { content in
this.temp = content
observer(.success(content))
}, onError: { error in
observer(.error(error))
})
}
observer(.success(this.temp))
return Disposables.create()
}
}

但是,由于您只是发出content而没有变化,因此您甚至不需要使用.create(_:).所以像这样:

func makeRepoRequest() -> Single<[String: Any]> {
if !temp.isEmpty {
return getRepo("364")
.do(onSuccess: { [weak self] in self?.temp = $0 })
}
else {
return Single.just(temp)
}
}

最后,您没有在getRepo(_:)方法中正确取消网络请求。它应该以return Disposables.create { task.cancel() }结尾

我建议你阅读更多关于一次性用品的信息。

最新更新