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

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

我会非常感谢你的帮助。

4

1 回答 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() }

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

于 2020-01-29T11:07:56.387 回答