2017-09-21 61 views
0
let defaultConfiguration = URLSessionConfiguration.default 
    let operationQueue = OperationQueue.main 
    let defaultSession = URLSession(configuration: defaultConfiguration, delegate: self, delegateQueue: operationQueue) 
    if let url = URL(string: "https://newsapi.org/v1/articles?source=abc-news-au&sortBy=top&apiKey=47d2ce48babd47b1bc391b426b89ca23") 
    { 
     (defaultSession.dataTask(with: url) { (data, response, error) in 

      if error != nil{ 
       return 
      } 
      do { 
       let resultJson = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] 
       if var dataDictionary = resultJson { 
        // dataDictionary["access_token"] as AnyObject 
        self.dataArray = dataDictionary["articles"] as! [Any] 
        var dataDictionary22 = self.dataArray[0] as! [String: Any] as [String : AnyObject] 
        let url = URL(string: 
         "\(String(describing: dataDictionary22["urlToImage"]!))") 
        print("url -> \(String(describing: url!))") 
        let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
         guard let data = data, error == nil else { 
          return 
         } 


          self.imageView.image = UIImage(data: data) 

        } 

        task.resume() 

       } 

      } catch { 
       print("Error -> \(error)") 
      } 

     }).resume() 
    } 

我试图通过nsurlsession获得从开放API的新闻更新,它有dictionary->阵列 - > dictionary->在关键的“urlToImage” 但IAM越来越像URL,但http://www.abc.net.au/news/image/8968140-1x1-700x700.jpg数据中没有得到的图像文件是空任何一个可以最小化代码长度并解决我的问题从url获取图片时出错?

+1

不要使用'[字符串:AnyObject ]作为Swift 3中的JSON字典表示。 JSON字典是'[String:Any]',因为所有的JSON字典值都是(Swift)值类型。 – vadian

回答

0

使用这段代码,您可以成功解析该特定的URL响应,我已经在Playground中进行了测试。

这个:"\(String(describing: dataDictionary22["urlToImage"]!))"不是从AnyObject得到String的方法,你应该使用条件转换。

if let url = URL(string: "https://newsapi.org/v1/articles?source=abc-news-au&sortBy=top&apiKey=47d2ce48babd47b1bc391b426b89ca23"){ 
    URLSession.shared.dataTask(with: url, completionHandler: { data, response, error in 
     guard error == nil, let data = data else { 
      print(error!);return 
     } 
     guard let resultJson = (try? JSONSerialization.jsonObject(with: data)) as? [String:Any] else { 
      return 
     } 
     print(resultJson) 
     guard let articles = resultJson["articles"] as? [[String:Any]], let firstArticle = articles.first else { return } 
     guard let imageUrlString = firstArticle["urlToImage"] as? String, let imageUrl = URL(string: imageUrlString) else { return } 
     URLSession.shared.dataTask(with: imageUrl, completionHandler: { data, response, error in 
      guard error == nil, let data = data else { 
       print(error!);return 
      } 
      let image = UIImage(data: data) 
      DispatchQueue.main.async { 
       self.imageView.image = image 
      } 
     }).resume() 
    }).resume() 
} 

如果你想获得的所有文章图片(在你的问题,你只解析第一个),只是改变guard let articles = resultJson["articles"] as? [[String:Any]], let firstArticle = articles.first else { return }以下几点:

for article in articles { 
    guard let imageUrlString = article["urlToImage"] as? String, let imageUrl = URL(string: imageUrlString) else { return } 
    URLSession.shared.dataTask(with: imageUrl, completionHandler: { data, response, error in 
     guard error == nil, let data = data else { 
      print(error!);return 
     } 
     let image = UIImage(data: data) 
     //use the image 
    }).resume() 
} 
+0

获取错误此应用程序正在从主线程访问引擎后,从后台线程修改自动布局引擎。这可能会导致引擎损坏和奇怪的崩溃 –

+0

你需要从主线程做UI更新,检查我更新的答案 –

+0

我想获取文章不首先我需要动态防范让articles = resultJson [“articles”] as? [[String:Any]],让firstArticle = [articles [number]] else {return}。但它显示错误 –