nsurlsession - Swift 3,未调用 URLSession dataTask completionHandler

标签 nsurlsession swift3

我正在编写一个库,所以不使用 UIKit,即使在我的 iOS 应用程序中也可以使用相同的代码,但是当我在命令行中执行时却没有。在 PlayGround 中,它似乎也有效。

由于某种原因回调没有被触发,所以打印语句没有执行。

internal class func post(request: URLRequest, responseCallback: @escaping (Bool, AnyObject?) -> ()) {
    execTask(request: request, taskCallback: { (status, resp)  -> Void in
            responseCallback(status, resp)
    })
}

internal class func clientURLRequest(url: URL, path: String, method: RequestMethod.RawValue,  params: Dictionary<String, Any>? = nil) -> URLRequest {
    var request = URLRequest(url: url)
    request.httpMethod = method
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: (params! as [String : Any]), options: .prettyPrinted)

        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData
    } catch let error as NSError {
        print(error)
    }
    return request
}

private class func execTask(request: URLRequest, taskCallback: @escaping (Bool,
    AnyObject?) -> ()) {

    let session = URLSession(configuration: URLSessionConfiguration.default)
    print("THIS LINE IS PRINTED")
    let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
        if let data = data {
            print("THIS ONE IS NOT PRINTED")
            let json = try? JSONSerialization.jsonObject(with: data, options: [])
            if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
                taskCallback(true, json as AnyObject?)
            } else {
                taskCallback(false, json as AnyObject?)
            }
        }
    })
    task.resume()
}

编辑 -:我正在编写一个库,所以不使用 UIKit,即使在我的 iOS 应用程序中也可以使用相同的代码,但是当我在命令行中执行时却没有。在 PlayGround 中,它似乎也有效。

最佳答案

我从头开始做了一个简单的应用程序。 (Xcode 8 beta 6/swift 3)
在 Controller 中,我粘贴了您的代码。 (加上网址创建..)
我在调试器中看到所有:

这个是打印的

这个也是打印的

我回来了

所以它似乎工作。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let URLString = "https://apple.com"
        let url = URL(string: URLString)
        let request = URLRequest(url: url!)


        ViewController.execTask(request: request) { (ok, obj) in

            print("I AM BACK")

        }

    }

    private class func execTask(request: URLRequest, taskCallback: @escaping (Bool,
        AnyObject?) -> ()) {

        let session = URLSession(configuration: URLSessionConfiguration.default)
        print("THIS LINE IS PRINTED")
        let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
            if let data = data {
                print("THIS ONE IS PRINTED, TOO")
                let json = try? JSONSerialization.jsonObject(with: data, options: [])
                if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
                    taskCallback(true, json as AnyObject?)
                } else {
                    taskCallback(false, json as AnyObject?)
                }
            }
        })
        task.resume()
    }

}

关于nsurlsession - Swift 3,未调用 URLSession dataTask completionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39053593/

相关文章:

swift - 尝试执行 segue 导致 "terminating with uncaught exception of type NSException"

uikit - CGRectMake、CGPointMake、CGSizeMake、CGRectZero、CGPointZero 在 Swift 中不可用

ios - Swift 3 - Alamofilre 4.0 多部分图像上传有进展

ios - 如何实现 "configurable"NSURLSession 共享 session ?

ios - 使用 NSURLSession 自定义委托(delegate)时不调用身份验证质询方法

ios - 如何获取 backgroundSession NSURLSessionUploadTask 响应

ios模拟器访问本地主机服务器

swift3 - 在 Swift3 中使用 SwiftyJSON

ios - 如何获取失败的 NSURLSessionDownloadTask 的下载数据?

ios - Swift3 如何像在 android 中一样在 iOS 中实现底部表单