RXSwift: подписчик никогда не получает обратный звонок - PullRequest
1 голос
/ 28 января 2020

У меня есть эта функция:

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

, но по какой-то причине подписка никогда не получает обратный вызов. Кто-нибудь из вас знает, почему подписка никогда не перезванивает?

Я буду очень признателен за вашу помощь.

1 Ответ

0 голосов
/ 29 января 2020

Ваш makeRepoRequest() определен неправильно. Одноразовый материал, который вы создаете внутри крышки, должен быть тем, который вы возвращаете. Там не должно быть никакого disposeBag, также вам нужно развернуть себя и убедиться, что что-то испускается, если 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() }

Я предлагаю вам прочитать больше об одноразовых предметах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...