在离线模式下获得响应

Posted

技术标签:

【中文标题】在离线模式下获得响应【英文标题】:Getting Response on offline mode 【发布时间】:2017-01-08 17:17:23 【问题描述】:

我在 swift 3.0 中访问了一个 Web 服务,并且在离线模式下也得到了响应。

这是我的工作的详细信息:

    我需要调用 1 个网络服务 - let url = URL(string: "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors")

    通过使用 URLSession.shared.dataTask(...) 方法,我调用了上面的 Web 服务。

    使用 try?声明' JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers) as AnyObject ' 我解析了数据。

    我运行了上面的代码,它给了我预期的响应(在线模式)。

    现在我关闭我的 wifi 并再次运行上面的代码,然后我再次获得与在线相同的数据。我将调试器放在成功部分的completionHandler 闭包上,然后到达该断点。

    我需要帮助。为什么我在离线模式下得到响应(我打印数组大小并显示大小 = 6)?

    这是代码。

    我正在使用 Swift 3.0 开发 Xcode 8.1

最后让 urlString = "http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"

覆盖 func viewDidLoad() super.viewDidLoad()

    self.downloadJsonWithURL()

    print("Inside viewDidLoad")

    // Do any additional setup after loading the view, typically from a nib.



func downloadJsonWithURL() 

    let url = URL(string: urlString)

    let task = URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) -> Void in


        if error != nil
        
            print("Error Found!!!!")
            return
        

        else
        
            guard let jsonObj = try? JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.mutableContainers) as AnyObject

                else
            
                // if 'let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary' fails(i.e falls) then this block will execute.
                return
            


            if let actorArray = jsonObj.value(forKey: "actors") as? NSArray 
                for actor in actorArray
                    print("Actor Array = \(actorArray.count)")
                    if let actorDict = actor as? NSDictionary 

                        if let name = actorDict.value(forKey: "name") 
                            self.nameArray.append(name as! String)
                        

                        if let name = actorDict.value(forKey: "dob") 
                            self.dobArray.append(name as! String)
                        

                        if let name = actorDict.value(forKey: "image") 
                            self.imgURLArray.append(name as! String)
                            let data = NSData(contentsOf: URL(string: name as! String)!)
                            self.imgArray.append(UIImage(data: data as! Data)!)
                        

                    
                


                OperationQueue.main.addOperation(
                    self.tableView.delegate = self as? UITableViewDelegate
                    self.tableView.dataSource = self
                    self.tableView.reloadData()

                )
            

        
    )


     task.resume()

【问题讨论】:

可能是因为您使用的是共享数据会话并且它正在缓存? 当 WIFI 关闭或您有 NSURLSession 缓存结果时,您正在使用一些移动连接(G3 等)。我认为默认情况下它不会缓存。详情请见this。 如果它解决了您的问题,请接受答案。 【参考方案1】:

在您的代码中添加以下代码。

    let urlConfig = URLSessionConfiguration.default
    urlConfig.requestCachePolicy = .reloadIgnoringLocalCacheData
    urlConfig.urlCache = nil

    let session = URLSession(configuration: urlConfig)

    let task = session.dataTask(with: url!, completionHandler: (data, response, error) -> Void in

【讨论】:

非常感谢 Nikunj Damani。我为此浪费了将近 2 天的时间。我从来没有在目标 C 中遇到过这样的问题。再次非常感谢

以上是关于在离线模式下获得响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 gps 在离线模式下显示当前位置

如何在离线模式下使用 Cordova Geolocation 插件

如何在离线模式下使用 WorldWind Android 应用程序

reverseGeocodeLocation(_ location: CLLocation) 方法是不是在离线模式下工作?

在 Jupyter 中使用 plotly 在离线模式下创建动画图表

在离线模式下获取当前日期