xra*_*age 6 nsurlsession swift3
我正在写一个库,所以不使用UIKit,即使在我的iOS应用程序中,相同的代码也可以工作,但是当我在命令行中执行时却没有.在PlayGround中也似乎有效.
由于某种原因,回调没有被触发,因此print语句没有执行.
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()
}
Run Code Online (Sandbox Code Playgroud)
编辑 - :我正在编写一个库,所以不使用UIKit,即使在我的iOS应用程序中,相同的代码也可以工作,但是当我在命令行中执行时却没有.在PlayGround中也似乎有效.
ing*_*nti 10
我从头做了一个简单的应用程序.(Xcode 8 beta 6/swift 3)在控制器中我粘贴了你的代码.(加上url创建..)我在调试器中看到了所有内容:
这一个是打印的
这一个是打印的,太
我回来了
所以它似乎工作.
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()
}
}
Run Code Online (Sandbox Code Playgroud)
所做的更改是否在这里建议,现在可以使用。
var sema = DispatchSemaphore( value: 0 )
private func execTask(request: URLRequest, taskCallback: @escaping (Bool,
AnyObject?) -> ()) {
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil )
session.dataTask(with: request) {(data, response, error) -> Void in
if let data = data {
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?)
}
}
}.resume()
sema.wait()
}
Run Code Online (Sandbox Code Playgroud)
我知道答案晚了,但是如果您还没有弄清问题或在其他地方遇到问题,请尝试一下。
您需要将会话变量保存在方法范围之外(使其成为实例变量)。由于您是在函数作用域中本地定义的。在调用完成处理程序之前,将其释放,记住完成处理程序无法保留您的会话对象,并且在执行运行循环之后,垃圾收集器将取消分配您的会话对象。每当我们要从委托或完成处理程序中回调时,都需要保留此类对象。
self.session = URLSession(configuration: URLSessionConfiguration.default)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47474 次 |
| 最近记录: |