This can be achieved in three simple steps.
import
PlaygroundSupport
call
PlaygroundPage.current.needsIndefiniteExecution = true
Write out your network request
upon completion of the network request call
PlaygroundPage.current.finishExecution()
To put this into context i'll be using the Github Jobs api to illustrate the steps above
- Step 1: - Add this statement to your playground
import Foundation
import PlaygroundSupport
- Step 2:- Right below the import statements set the needs Indefinite Execution to true
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
Good progress so far. As per you needs create your network request, for our tutorial we'll create a Github Jobs API request as follows
- First we'll define our Struct which implements the Codable protocol and it defines the shape of our response , then we'll make the Network call.
You file should look like this
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
struct GithubJob: Codable {
var company: String?
var company_logo: String?
var company_url: String?
var description: String?
var id: String?
var location: String?
var title: String?
var url: String?
}
func fetchGithubJobs(completionHandler: @escaping(Result<[GithubJob],Error>) -> Void) {
//create an instance of the jsonDecoder
let jsonDecoder = JSONDecoder()
//create a dataTask
let session = URLSession(configuration: .default, delegate: nil, delegateQueue: .main)
let endpoint = "https://jobs.github.com/positions.json?description=api"
//create a url from the endpoint
guard let endpointURL = URL(string: endpoint) else {
return
}
//create a request
var request = URLRequest(url: endpointURL)
request.httpMethod = "GET"
//create the dataTask
let dataTask = session.dataTask(with: request) { (data, _, error) in
//check if error is nil
guard error == nil else {
completionHandler(.failure(error!))
return
}
//check if we already have data
guard let jsonData = data else {
return
}
//try to decode the response
do {
let githubJobs = try jsonDecoder.decode([GithubJob].self, from: jsonData)
print("Jobs are \(githubJobs)")
completionHandler(.success(githubJobs))
} catch {
print("Something Went wrong")
completionHandler(.failure(error))
}
}
dataTask.resume()
}
The last step involves us calling our function and then once our function finishes executing calling PlaygroundPage.current.finishExecution()
Adding this last step your file should look like the code snippet below.
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
struct GithubJob: Codable {
var company: String?
var company_logo: String?
var company_url: String?
var description: String?
var id: String?
var location: String?
var title: String?
var url: String?
}
func fetchGithubJobs(completionHandler: @escaping(Result<[GithubJob],Error>) -> Void) {
//create an instance of the jsonDecoder
let jsonDecoder = JSONDecoder()
//create a dataTask
let session = URLSession(configuration: .default, delegate: nil, delegateQueue: .main)
let endpoint = "https://jobs.github.com/positions.json?description=api"
//create a url from the endpoint
guard let endpointURL = URL(string: endpoint) else {
return
}
//create a request
var request = URLRequest(url: endpointURL)
request.httpMethod = "GET"
//create the dataTask
let dataTask = session.dataTask(with: request) { (data, _, error) in
//check if error is nil
guard error == nil else {
completionHandler(.failure(error!))
return
}
//check if we already have data
guard let jsonData = data else {
return
}
//try to decode the response
do {
let githubJobs = try jsonDecoder.decode([GithubJob].self, from: jsonData)
print("Jobs are \(githubJobs)")
completionHandler(.success(githubJobs))
} catch {
print("Something Went wrong")
completionHandler(.failure(error))
}
}
dataTask.resume()
}
fetchGithubJobs { result in
switch result {
case .success(let jobs):
print("Jobs are \(jobs)")
default:
print("Something Went Wrong")
}
PlaygroundPage.current.finishExecution()
}
Execute this and you should see the Job listing on the debug area.
Top comments (0)