0

这是我工作得很好的非反应性代码。

函数 getLatestHtml2 () {

Alamofire.request("https://www.everfest.com/fest300").responseString { response in
    print("\(response.result.isSuccess)")
    if let html = response.result.value {
        self.parseHTML(html: html)
    }
}

}

但是,当我使用此代码使其具有反应性时。

  func getLatestHtml1() -> Observable<String> {

        return Observable<String>.create { (observer) -> Disposable in
            let request = Alamofire
                .request("https://www.everfest.com/fest300")
                .responseString { response in
                    print(response.result.value)
                    observer.onNext(response.result.value!)
                    observer.onCompleted()

            }
            return Disposables.create { request.cancel() }


        }
    }

我在打印语句中没有得到任何数据。我什至使用了 RxAlamofire,我觉得这段代码是正确的方法,它有错误检查:

func getLatestHtml() -> Observable<String?> {
        return RxAlamofire

            .requestData(.get,"https://web.archive.org/web/20170429080421/https://www.everfest.com/fest300" )
            .debug()
            .catchError { error in
                print(error)
                return Observable.never()
            }
            .map { (response, value) in
                print(response.statusCode)
                guard response.statusCode == 200 else { return nil }
                print(value)
                return String(data: value, encoding: String.Encoding.utf8)
            }
            .asObservable()



    }

它在任何地方都没有产生数据或错误。我需要知道我的语法是否错误,或者我对反应式编程的想法是否错误。

我将其称为 .getLatestHTMLX()。谢谢 !

4

1 回答 1

1

Observable 很懒惰,除非被监视,否则它们不会做任何工作(并且通常会在没有人监视时立即停止工作。)这意味着您必须订阅 observable 才能开始发出值。

此外,除非您明确共享 observable,否则它将为每个订阅者启动一个新请求。

于 2017-06-01T23:48:34.470 回答