2016-11-26 2 views
2

Je suis en train d'obtenir des cotations boursières de Yahoo en utilisant Swift 3. Bien qu'il existe quelques tutoriels décents sur Swift 2, aucun d'entre eux semblent bien traduire à Swift 3.rapide 3 urlRequest session.dataTask pas de tir

Le problème que j'ai pour le moment est que dans le code ci-dessous, la session.dataTask n'est jamais appelée. L'instruction d'impression ne se déclenche jamais et le reste du code qui s'y trouve ne fonctionne pas.

J'ai vérifié que la variable de requête semble bonne, et l'URL a été testée sur le site de développeur Yahoo. Donc, je pense que je dois avoir tort la syntaxe de la DataTask ou avoir une erreur, donc je suis complètement ignorée.

Des pensées?

urlString = "http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN ('APL')" 

     //let urlNSS : NSString = urlString as NSString 
     let urlStr : String = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! 
     let url : URL = URL(string: urlStr as String)! 
     let request = URLRequest(url: url) 
     let session = URLSession.shared 
     let config = URLSessionConfiguration.default 

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

      print("in the task") 

      .. 
      .. 
     )} 

task.resume() 

Si je visite la tâche que je vois ce qui suit enter image description here

+0

Est-ce un programme de ligne de commande? Ensuite, vous avez besoin d'une boucle d'exécution: http://stackoverflow.com/questions/25126471/cfrunloop-in-swift-command-line-program. - Ou un terrain de jeu? Alors cela devrait aider: http://stackoverflow.com/questions/24058336/how-do-i-run-asynchronous-callbacks-in-playground. –

Répondre

3

Vous devez reprendre la tâche (task.resume()) que vous avez créé. Par défaut, une tâche est en état suspendu. J'ai créé un fichier Playground avec une autre URL de flux RSS de Yahoo. https://drive.google.com/file/d/0B5nqEBSJjCriWl9UTWcxSE42Yk0/view?usp=sharing

L'URL que vous avez dans votre question ne donne aucune donnée.

<error xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:lang="en-US"> 
<description>No definition found for Table yahoo.finance.quotes</description> 
</error> 

Code comme ci-dessous:

//: Playground - noun: a place where people can play 

import UIKit 
import Foundation 
import PlaygroundSupport 
PlaygroundPage.current.needsIndefiniteExecution = true 
var str = "Hello, playground" 

let yahooURLString = "https://feeds.finance.yahoo.com/rss/2.0/headline?s=yhoo&region=US&lang=en-US" 
let yahooRSSURL: URL = URL(string: yahooURLString)! 

var request = URLRequest(url: yahooRSSURL) 
request.httpMethod = "GET" 

let sessionConfig = URLSessionConfiguration.default 
let session = URLSession(configuration: sessionConfig) 
let task = session.dataTask(with: request) {data, response, err in 
    print("Entered the completionHandler") 
    print("Response JSON:\n\(String(data: data!, encoding: String.Encoding.utf8)!)") 
} 
task.resume() 

Hope this helps.


Edit: Fixation d'une capture d'écran des instructions d'impression apparaissant dans la console de playgorund. enter image description here

+0

merci pour la réponse. Si je l'exécute dans un simulateur, je ne reçois aucune erreur, mais aucune des instructions d'impression ne tire non plus. donc soit il y a un problème avec la façon dont j'appelle la fonction, les tâches ne permettent pas une instruction d'impression, au milieu du code, ou les simulateurs n'aiment pas ce type de code? –

+0

également si je mets un point d'arrêt après task.resume() et examine la tâche il n'a aucune valeur dans l'un des composants –

+0

@MichaelMoulsdale Avez-vous téléchargé et vérifiez le dossier de terrain de jeu. J'ai joint une capture d'écran de sortie imprimée dans la console de débogage. Également clarifiant les déclarations d'impressions fonctionne dans le simulateur ainsi que dans les tâches à l'intérieur, les points d'arrêt fonctionnent aussi! –