2017-08-20 1 views
0

Lorsque j'ai joué avec le code en utilisant Xcode playground, le code suivant fonctionne. qui peut être renvoyé à la file d'attente principale et imprimer in main queue..Récupérer des données à partir d'Internet dans le terminal

mais lorsque j'ai inséré le code suivant et générer le code en tant que commande bash. Ça ne marche pas. Il a imprimé toutes les lignes sauf in main queue.. Par conséquent, je crois que si le code est respecté en tant que commande bash lorsque le code s'exécute DispatchQueue.main.async, il se passera quelque chose qui ne peut pas être envoyé à la file d'attente principale. Comment puis-je résoudre ce problème?

import Foundation 
let defaultSession = URLSession(configuration: URLSessionConfiguration.default) 
let url = URL(string: "https://api.pearson.com/v2/dictionaries/ldec/entries?headword=test&apikey=zAONRFmzZsfQ4H4F53kJbpOzq9CUJtnS") 
if let url = url { 
    print("start") 
    defaultSession.dataTask(with: url, completionHandler: {data, response, error in 
     print("other queue.") 
     if let error = error { 
      print(error) 
      return 
     } else if let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode, let data = data {//, let result = data as? Dictionary<String, Any> { 
      //print(result) 
      print("going back to the main queue") 
      DispatchQueue.main.async { 
       print("in main queue.") 
      } 
     } else { 
      print("something really wrong") 
     } 
    }).resume() 
} 
while true {} 

Répondre

-2

Regardez le code ci-dessous. Cela fonctionnera avec le terrain de jeu et le terminal.

import Foundation 

var isRunning: Bool = true 
let defaultSession = URLSession(configuration: URLSessionConfiguration.default) 
let url = URL(string: "http://www.google.com")! 
print("start") 
defaultSession.dataTask(with: url, completionHandler: {data, response, error in 
    print("other queue.") 
    if let error = error { 
     print(error) 
     return 
    } else if let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode, let data = data { 
     print("before main queue - isMainThread=",Thread.current.isMainThread) 
     DispatchQueue.main.async { 
      print("executed in main queue - isMainThread=",Thread.current.isMainThread) 
      // you may consider exiting while loop    
      isRunning = false 
     } 
    } else { 
     print("something really wrong") 
    } 
}).resume() 
while(isRunning) { 
    RunLoop.current.run(mode: RunLoopMode.defaultRunLoopMode, before: Date()) 
    usleep(3) 
}