2017-09-21 4 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() 
    } 

Ich versuche, Nachrichten Updates von den offenen api durch nsurlsession zu bekommen und es hat dictionary-> Array-> dictionary-> auf die Taste „urlToImage“ aber iam bekommen URL wie http://www.abc.net.au/news/image/8968140-1x1-700x700.jpg aber nicht Image-Datei in Daten bekommen es war leer kann irgendjemand den Code lenth minimieren und mein Problem lösenFehler beim Abrufen des Bildes von der URL?

+1

Verwenden Sie keine '[String: ANYOBJECT ] 'als JSON-Wörterbuchdarstellung in Swift 3 überhaupt. Ein JSON-Wörterbuch ist '[String: Any]', weil alle JSON-Dictionary-Werte (Swift) -Werttypen sind. – vadian

Antwort

0

Mit diesem Code können Sie diese spezifische URL-Antwort erfolgreich parsen, ich habe es in einem Playground getestet.

Dies ist: ist nicht die Art und Weise erhalten String von einem AnyObject, sollten Sie bedingte Casting verwenden.

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() 
} 

Wenn Sie alle Artikel Bilder erhalten möchten (in Ihrer Frage nur Sie wurden die ersten Parsing), ändern Sie einfach guard let articles = resultJson["articles"] as? [[String:Any]], let firstArticle = articles.first else { return } auf die folgenden:

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

Fehler erhalten Diese Anwendung ändert die Auto-Layout-Engine von einem Hintergrundthread, nachdem auf die Engine vom Hauptthread aus zugegriffen wurde. Dies kann zu Motorbeschädigung und seltsamen Abstürzen führen –

+0

Sie müssen UI-Updates aus dem Hauptthread zu tun, überprüfen Sie meine aktualisierte Antwort –

+0

Ich möchte Artikel nicht zuerst ich brauche dynamisch Schutz lassen Artikel = resultJson ["Artikel"] als? [[String: Any]], lese firstArticle = [artikel [nummer]] else {return}. aber es zeigt Fehler –

Verwandte Themen