【问题标题】:-- function-call with completion URLRequest - JSON-- 带有完成 URLRequest 的函数调用 - JSON
【发布时间】:2019-02-10 11:51:53
【问题描述】:

我确实阅读了很多关于带有完成处理程序的函数,但现在我遇到了如何以正确方式调用此函数 (downloadJSON) 的问题。我必须在函数中提供哪些参数并在我自己的调用函数的类中处理结果数据(json)。

这是来自 David Tran 的代码。 Hi 制作了精彩的教程,但是代码中没有调用这个函数。

let request: URLRequest
lazy var configuration: URLSessionConfiguration = URLSessionConfiguration.default
lazy var session: URLSession = URLSession(configuration: self.configuration)

typealias JSONHandler = (JSON?, HTTPURLResponse?, Error?) -> Void

func downloadJSON(completion: @escaping JSONHandler)
{
    let dataTask = session.dataTask(with: self.request) { (data, response, error) in
        // OFF THE MAIN THREAD
        // Error: missing http response
        guard let httpResponse = response as? HTTPURLResponse else {
            let userInfo = [NSLocalizedDescriptionKey : NSLocalizedString("Missing HTTP Response", comment: "")]
            let error = NSError(domain: DANetworkingErrorDomain, code: MissingHTTPResponseError, userInfo: userInfo)
            completion(nil, nil, error as Error)
            return
        }

        if data == nil {
            if let error = error {
                completion(nil, httpResponse, error)
            }
        } else {
            switch httpResponse.statusCode {
            case 200:
                // OK parse JSON into Foundation objects (array, dictionary..)
                do {
                    let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any]
                    completion(json, httpResponse, nil)
                } catch let error as NSError {
                    completion(nil, httpResponse, error)
                }
            default:
                print("Received HTTP response code: \(httpResponse.statusCode) - was not handled in NetworkProcessing.swift")
            }
        }
    }

    dataTask.resume()
}

【问题讨论】:

    标签: json swift urlrequest completion


    【解决方案1】:

    让 Xcode 帮助您。输入downlo 并按回车键。 Xcode完成功能

    再按回车键就可以得到参数了

    例如,您必须将占位符替换为参数名称

    downloadJSON { (json, response, error) in
         if let error = error {
             print(error)
         } else if let json = json {
             print(json)
         }
    }
    

    注意:

    您的代码中有一个致命的类型不匹配错误:JSONSerialization 行的结果是 [String:Any] 但完成处理程序的第一个参数是 JSON

    【讨论】:

    • 嗨@vadian,谢谢。用你的方式编码是可行的,但是 json 的结果是一个错误:表达式产生错误:错误:/var/folders/jx/tcglx0y92y51qlyf7n5fd1_c0000gn/T/expr13-d41d2a..swift:1:65:错误:使用未声明的类型' JSON' Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer(bitPattern: 0x12b6fab50)!.pointee) 这是您对类型不匹配的说明。那里有什么?
    • JSON 属于第三方库SwiftyJSON。你必须添加和import它。但是现在(Swift 4+)鼓励你使用内置的Codable 协议。类型不匹配只是类型不匹配。
    • 好的。你的意思是 JSON? 是一个 SwiftyJSON 类或方法,例如我必须用 cocoapods 导入它?在我上一堂课中,这段代码运行良好,我可以很好地解析 JSON。 ` let fetchedData = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! NSArray ` 我已将结果定义为 NSArray。这样我就可以处理 JSON 数据了。
    • 不要在 Swift 中使用 NSArray/NSDictionary。你扔掉类型信息。使用本机类型。正如我所说,在 Swift 4+ 中解码 JSON 的最先进技术是 (De)codable。它是内置的,比任何其他解析第三方库更高效。
    猜你喜欢
    • 2020-07-28
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多