Reputation: 87
I'm trying to download JSON file from server & following an tutorial to do this (http://www.learnswiftonline.com/mini-tutorials/how-to-download-and-read-json/)
First I tried 'checking the response' part (I added some part to see what's wrong)
let requestURL: NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("Everyone is fine, file downloaded successfully.")
} else {
print("Failed")
}
task.resume()
This should print either "Everyone is fine~" or "Failed" but neither comes up... I tried to see statusCode so I put print(statusCode)
inside task
but again nothing is printed.
This is my screenshot of the playground:
+
CFRunLoop in Swift Command Line Program
This was the answer I was looking for, since I was dealing with OS X command line application (I moved the whole bunch to playground to see what would happen). Check this if you're the same with me
Upvotes: 6
Views: 26829
Reputation: 6013
Swift 5
let requestURL: NSURL = NSURL(string: "https://irdirect.net/template_files/1294/stock-price.html")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)
let session = URLSession.shared
let task = session.dataTask(with: urlRequest as URLRequest) {
(data, response, error) -> Void in
let httpResponse = response as! HTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("Everyone is fine, file downloaded successfully.")
do{
let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any]
}
catch{ print("erroMsg") }
} else {
print("Failed")
}
}
task.resume()
}
Upvotes: -1
Reputation: 714
You can not see anything because dataTaskWithRequest
is asynchronous, and your playground just stops after 'task.resume()`. The asynchronous task does not get the change to run.
You can call this in the end, after task.resume
:
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
also 'import XCPlayground', something like this:
import Foundation
import XCPlayground
let requestURL: NSURL = NSURL(string: "http://www.learnswiftonline.com/Samples/subway.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("Everyone is fine, file downloaded successfully.")
} else {
print("Failed")
}
}
task.resume()
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
This post may clarify more: How do I run Asynchronous callbacks in Playground
EDIT:
In Swift 3, this changed a bit.
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
Upvotes: 6
Reputation: 471
works fine in my project after I changed "http" -> https, Apple announced “App Transport Security” for iOS 9 and OSX 10.11 El Capitan
let requestURL: NSURL = NSURL(string: "https://www.learnswiftonline.com/Samples/subway.json")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("Everyone is fine, file downloaded successfully.")
} else {
print("Failed")
}
}
task.resume()
the http response:
<NSHTTPURLResponse: 0x7a670300> { URL: https://www.learnswiftonline.com/Samples/subway.json } { status code: 200, headers {
"Content-Encoding" = gzip;
"Content-Type" = "application/json";
Date = "Tue, 16 Feb 2016 07:43:05 GMT";
"Last-Modified" = "Sat, 14 Nov 2015 08:21:26 GMT";
Server = "cloudflare-nginx";
"Set-Cookie" = "__cfduid=d9d92befe8746168b2b291f5bfb8996081455608585; expires=Wed, 15-Feb-17 07:43:05 GMT; path=/; domain=.learnswiftonline.com; HttpOnly";
"cf-ray" = "27579e989ad5208a-KIX";
} }
or error if use http
Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSErrorFailingURLStringKey=http://www.learnswiftonline.com/Samples/subway.json, NSErrorFailingURLKey=http://www.learnswiftonline.com/Samples/subway.json, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., NSUnderlyingError=0x7866de20 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}})
Upvotes: 0