代码未进入数据任务的完成处理程序
Posted
技术标签:
【中文标题】代码未进入数据任务的完成处理程序【英文标题】:the code is not entering the completion handler of the data task 【发布时间】:2019-09-12 08:05:43 【问题描述】:完成处理程序代码未得到执行。当我调试代码时,它的到来直到 session.datatask 并且之后它没有进入完成处理程序。我们实际上正在将这个项目从objectivec迁移到swift。我不确定生成的请求是否击中 django。如何进一步调试。在 datatask 之后,控件退出 if 请求循环,并且执行顺利,没有任何错误。但数据不是从数据库中获取的。
func makeRequest(_ url: String?, path: String?, httpMethod: String?, httpBody httpBoday: Data?, completion: @escaping (_ result: [AnyHashable : Any]?, _ error: Error?) -> Void)
let headers = [
"cache-control": "no-cache",
"Authorization": "Token f491fbe3ec54034d51e141e28aaee87d47bb7e74"
]
var request: URLRequest? = nil
if let url = URL(string: "\(url ?? "")\(path ?? "")")
request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
request?.httpMethod = httpMethod ?? ""
request?.allHTTPHeaderFields = headers
let configuration = URLSessionConfiguration.default
configuration.httpCookieStorage = nil
configuration.requestCachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData
if #available(ios 11.0, *)
configuration.waitsForConnectivity = false
let session = URLSession(configuration: configuration)
// let session = URLSession.shared
var task: URLSessionDataTask? = nil
print ("Request =======>",request)
if let request = request
task = session.dataTask(with: request , completionHandler: data, response, error in
//.dataTask(with: request, completionHandler: data, response, error in
print ("testing******************")
var result: Any? = nil
if error != nil
if let error = error
print("\(error)")
if completion != nil
completion(nil, error)
else
var string: String? = nil
if let data = data
string = String(data: data, encoding: .utf8)
string = self.string(byRemovingControlCharacters: string)
do
if let data = string?.data(using: .utf8)
result = try JSONSerialization.jsonObject(with: data, options: []) as! [AnyHashable : Any]
print ("Result ===============>",result)
catch
print("Error while getting the data from json object")
DispatchQueue.main.async()
if completion != nil
completion(result as! [AnyHashable : Any], error)
)
else
print("Inside the else block of request")
task?.resume()
【问题讨论】:
为什么几乎所有东西都是可选的?这看起来很像字面翻译的 Objective-C 代码。请学习如何在 Swift 中声明非可选的局部变量。在传递所有配置内容之前,请尝试使用URLSession.shared
进行网络请求。创建 URL 的方式看起来也很奇怪。网址有效吗?使用调试器,设置断点。
糟糕的翻译。您是否再次验证了复合 URL?
Vadian - 这只是目标 c 的直译。我的意思是自动翻译。只是在需要的地方修复错误。邮递员的这个请求工作正常。即使没有配置,我也尝试过它仍然无法正常工作。实际上我的代码没有配置细节。但只是搜索了解决方案并尝试了配置。但还是徒劳。
我明白你在说什么,但你似乎不明白我在说什么????。请不要repost questions。改进您的问题。
当然,因为我没有得到任何答案,所以我只是在更清晰的阶段重新发布了这个问题
【参考方案1】:
这一行是你的问题:
if let url = URL(string: "\(url ?? "")\(path ?? "")")
request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
应该是这样的:
guard let urlString = url else return
guard let path = path else return
if let requestURL = URL(string: "\(urlString)\(path)"
request = URLRequest(url: requestURL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
另外,应该没什么区别,但你有 2 个不同的缓存策略。 此外,您没有在任何地方使用 httpBody。我想你的请求不需要它,但我想我会提醒你看看。
【讨论】:
但至少if let requestURL
是真实的并且你有一个实际的request
?
刚刚注意到:你为什么要对照 nil 检查完成情况? if completion != nil
摆脱那张支票,直接打电话给你的completion
是的 requestURL 具有实际工作正常的 URL以上是关于代码未进入数据任务的完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章
WebDriverException:未处理的检查器错误,代码为“-3200”
用户按下主页按钮后,应用程序未进入应用程序 didfinishlaunchingwith 选项