【发布时间】:2016-08-20 11:27:19
【问题描述】:
我正在编写一个库,所以不使用 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()
}
Edits -:我正在编写一个库,所以不使用 UIKit,即使在我的 iOS 应用程序中,相同的代码也可以工作,但是当我在命令行中执行时不会。在 PlayGround 中,它似乎也可以工作。
【问题讨论】:
-
但是如果
Both print statements in below code is not executing那么这与回调无关......只是你的dataTask方法永远不会被调用。 -
请告诉我们你如何调用你的
dataTask私有方法。 -
从另一种方法调用它。变量任务正在创建,然后到达 resume()。但completionHandler 没有执行。添加其他有问题的代码。
-
我现在添加了有问题的整个代码,改变了你建议的方式。还是行不通。仅供参考,我正在使用 xcode-beta-6 "session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in"
-
好的,我会在你建议的重构后一分钟内编辑这篇文章。
标签: nsurlsession swift3