RXSwift:订户永远不会回叫

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

我具有此功能:

    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()
        }
    }

但是由于某种原因,它永远不会回叫。你们谁都知道为什么订阅永远都不会回电话?

非常感谢您的帮助。

ios rx-swift xcode11 swift5.2
1个回答
0
投票

您的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() }

结尾

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

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