在离线模式下获得响应
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 中遇到过这样的问题。再次非常感谢以上是关于在离线模式下获得响应的主要内容,如果未能解决你的问题,请参考以下文章
如何在离线模式下使用 Cordova Geolocation 插件
如何在离线模式下使用 WorldWind Android 应用程序
reverseGeocodeLocation(_ location: CLLocation) 方法是不是在离线模式下工作?