代码未进入数据任务的完成处理程序

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 选项

一些有价值bug产生的思考

在应用程序被杀死后在应用程序启动时恢复未完成的多部分/表单数据上传任务

未调用dismissViewController 完成处理程序