寻求 Alamofire 响应作为字符串,但响应始终为零

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

我正在尝试从网站下载一些 HTML,解析它, 并将其显示在网格中。 HTML 格式不是很好, 所以我已经写了一个解析它的 init() 方法 HTML 作为字符串。

我的 init() 在我的单元测试中运行良好。

我遇到的麻烦是,将 HTML 作为 通过 Alamofire 的字符串。我能找到的所有例子似乎 暗示我需要做一些接近于此的事情......


import SwiftUI
import Alamofire
func getHtml()-> String
{
    let x = AF.request("https://httpbin.org/get")
        .validate()
        .response
    if let y = x {
        debugPrint(y)
        return y.something()
    }
    return "<!-- the html could not be retrieved -->"
}

struct ContentView: View {
    var body: some View {
        Text(getHtml())
            .padding()
    }
}

我的挑战是 AF.request().response 似乎总是 是零。我觉得这很奇怪,因为所有的 Alamofire 例子 我在网上看到似乎甚至都没有检查过。它是 就好像旧的 Alamofire 返回了一个 HTTPResponse,而不是 HTTPResponse?

有没有一种简单的方法可以检索(非 JSON)输出 我正在查看的网站,然后将其交给我 构造函数?有或没有 Alamofire?

谢谢!

如果重要的话,这是 Alamofire 5.6.3

我尝试过的事情:

  • 我试过有/没有 validate()
  • 理论响应是异步的,我尝试添加一个 braindead while 循环: 同时(响应!=空){ 睡觉(1) }
swift swiftui alamofire
1个回答
0
投票

调用异步函数获取结果后不能返回

您需要

wait
获得结果,然后使用它们。有很多方法可以做到这一点, 包括
completion handlers
。你将不得不查找如何使用 Swift 中的异步函数。

这里是一些代码,显示了 Alamofire 的另一个替代方案,使用 Swift async/await 框架, 从异步函数

html
.
获取
getHtml()

字符串

请注意,您会从显示的网址中获取一些 JSON 数据,这些数据很容易被解码为 模型如果需要的话。

struct ContentView: View {
    @State var htmlString = "no data"
    
    var body: some View {
        Text(htmlString)
        .task {
            await getHtml()
        }
        // Alamofire
//        .onAppear {
//            getHtml2() { html, error in
//                if error == nil {
//                    print("\n---> html: \n \(html) \n")
//                     htmlString = html
//                }
//            }
//        }
    }
    
    func getHtml() async {
        if let url = URL(string: "https://httpbin.org/get") {
            do {
                let (data, _) = try await URLSession.shared.data(from: url)
                let theString = String(data: data, encoding: .utf8)!
                print("\n---> theString: \n \(theString) \n")
                htmlString = theString
            } catch {
                print(error)
            }
        }
    }
    
    
    // using Alamofire, not tested
    func getHtml2(completion: @escaping  (String?, Error?) -> Void)  {

        AF.request("https://httpbin.org/get").response { response in
            switch response.result {
            case .success(_):
                do {
                    let data = response.data!
                    let theString = String(data: data, encoding: .utf8)!
                    completion(theString, nil)
                } catch {
                    print(error)
                    completion(nil, error)
                }
            case .failure(let AFError):
                let error = AFError
                print(error)
            }
        }
    }
    
}
© www.soinside.com 2019 - 2024. All rights reserved.