繁体   English   中英

网络服务返回零

[英]Webservice returning nil

我无法使用从 Web 服务获取的 returnHTML 数据填充 UITextField。

如果我有这样的网络服务:

import Foundation;
class WebSessionCredentials {
    static let requestURL = URL(string:"xxxx.on.ca/getData.aspx?requestType=Tech")!
    var htmlbody: String?
    var instancedTask: URLSessionDataTask?
    static var sharedInstance = WebSessionCredentials()
    init() {
        self.instancedTask = URLSession.shared.dataTask(with: WebSessionCredentials.requestURL) { [weak self] (data,response,error) in
            if let error = error {
                // Error
                print("Client Error: \(error.localizedDescription)")
                return
            }
            guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
                print("Server Error!")
                return
            }
            guard let mime = response.mimeType, mime == "text/html" else {
                print("Wrong mime type!");
                return
            }
            
            if let htmlData = data, let htmlBodyString = String(data: htmlData, encoding: .utf8) {
                self?.htmlbody = htmlBodyString;
            };
        };
    };
};

通过这个,我应该能够通过WebSessionCredentials.sharedInstance.htmlbody;访问返回的 HTML 响应WebSessionCredentials.sharedInstance.htmlbody;

在操场上验证这一点,我似乎在课堂内得到了正确的响应,但是当从课堂外调用 htmlbody 时,我得到了一个 nil 响应——我不知道如何将我从课堂上得到的 HTML 字符串发送到函数之外。 这个问题是建立在我几天前发布的另一个问题之上的 -> 将私有声明的变量委托给公共范围

谢谢,

不是在init方法中实现dataTask添加一个方法run with completion handler

class WebSessionCredentials {

    enum WebSessionError : Error {
        case badResponse(String)
    }

    static let requestURL = URL(string:"xxxx.on.ca/getData.aspx?requestType=Tech")!
    static var sharedInstance = WebSessionCredentials()

    func run(completion : @escaping (Result<String,Error>) -> Void) {
        let instancedTask = URLSession.shared.dataTask(with: WebSessionCredentials.requestURL) { (data,response,error) in
            if let error = error {
                // Error
                print("Client Error: \(error.localizedDescription)")
                completion(.failure(error))
                return
            }
            guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
                completion(.failure(WebSessionError.badResponse("Server Error!")))
                return
            }
            guard let mime = response.mimeType, mime == "text/html" else {
                completion(.failure(WebSessionError.badResponse("Wrong mime type!")))
                return
            }
            completion(.success(String(data: data!, encoding: .utf8)!))
        }
        instancedTask.resume()
    }
}

并使用它

WebSessionCredentials.sharedInstance.run { result in
    switch result {
    case .success(let htmlBody): print(htmlBody)
    case .failure(let error): print(error)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM