Swift 3.0 notification transformable to array or array of dictionaries? - notifications
Getting this data back as a notification and want to read it into usable variable types. I got all of them to work but the rewards and aps
%# [AnyHashable("description"): Open 10 common chests., AnyHashable("icon"): localhost:8000//media/achievements/Common%20Chest%20Go- Getter/bomb.jpg, AnyHashable("name"): Common Chest Go-Getter, AnyHashable("gcm.message_id"):1486597426811663%bf6da727bf. 6da727, AnyHashable("rewards"): {"Battle helm":1,"Gems":1000}, AnyHashable("aps"): {
alert = "Achievement Completed";
}]
So how do convert that to a usable variable?
AnyHashable("rewards"): {"Battle helm":1,"Gems":1000}, AnyHashable("aps"): {
alert = "Achievement Completed";
}
The returned item is called userInfo so like...
let rewards = userInfo["rewards"] as! [String:Int]
Doesn't work, any help on this would be greatly appreciated! Again I'm in swift 3.0 so swift 3.0 examples could help.
the notification userInfo is parsed as a Dictionary<String, Any> or [String: Any]
let userInfo: [String: Any] = [
"description": "Open 10 common chests.",
"icon": "localhost:8000//media/achievements/Common%20Chest%20Go- Getter/bomb.jpg",
"name": "Common Chest Go-Getter",
"gcm.message_id": "1486597426811663%bf6da727bf. 6da727",
"rewards": [
"Battle helm": 1,
"Gems":1000
],
"aps": [
"alert": "Achievement Completed"
]
]
if let rewards = userInfo["rewards"] as? [String: Any] {
if let battle = rewards["Battle helm"] as? Int {
print(battle) // 1
}
if let gems = rewards["Gems"] as? Int {
print(gems) // 1000
}
}
if let aps = userInfo["aps"] as? [String: Any] {
if let alert = aps["alert"] as? String {
print(alert) // Achievement Completed
}
}
Looks like you are confused with this:
let arrayOfStrings = [String]()
let dictionary = [String: Any]()
let arrayOfDictionaries = [[String:Any]]()
Related
How to Display Post Method Requests data in Swiftui Ios Simulator Screen?
This is Doc File Generate in Postman by write method and url "link/services.php". This is Header File. #Headers({"Content-Type: application/json"}) #POST("services.php") Observable<Division> divisionListApi(#Body HashMap<String, String> map); map.put("method", "My_List"); After Postman Generation I Got This Given Below. {"err_code":9, "message":"My List ", "list":[ {"ForestDivision":"Yam(T)"}, {"ForestDivision":"Rewar(T)"}, {"ForestDivision":"Ro(T)"}, {"ForestDivision":"Bh(T)"}, {"ForestDivision":"Ka(T) "}, {"ForestDivision":"Ambal(T) "}, {"ForestDivision":"Fari(T)"}] } I have made request by taking post mehod, is this the right way to create code in swiftui. import Foundation import Combine struct File: Decodable, Hashable { var error_code : Int var message : String var list : [lisst] } struct lisst: Decodable, Hashable { var ForestDivision: String } class fetchResults : ObservableObject{ #Published var fetchedRes : [lisst]? func getData(completion: #escaping (File) -> ()){ print("Fetch") let parameters = "{ I dont Know }" let postData = parameters.data(using: .utf8) var request = URLRequest(url: URL(string: "URl")!,timeoutInterval: Double.infinity) request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" request.httpBody = postData let task = URLSession.shared.dataTask(with: request) { (data, _, _) in let resultList = try! JSONDecoder().decode(File.self, from: data!) print(" ") print("ID: \(resultList.error_code)") print("VOLUME: \(resultList.message)") print("READINGS: \(String(describing: resultList.list))") print(" ") print("SUCCESS: Got data - \(data! )") DispatchQueue.main.async { completion(resultList) // << here !! } } task.resume() } } Also How to Write in Swiftui View. To Make Properly Works in List View. import SwiftUI import UIKit struct DivisionList: View { #ObservedObject var res = fetchResults() var body: some View { NavigationView { Text("Nothing Here") List(res.fetchedRes ?? [], id: \.self) { resp in // Error Here ForEach(res.list, id: \.self) { course in VStack { Text(res.for) // Error Here } } } .navigationBarTitle("Data") .onAppear(perform: { self.getData // Error Here }) } } } struct DivisionList_Previews: PreviewProvider { static var previews: some View { DivisionList() } }
Create New Swift File Copy this Post Requests. import Foundation import Combine let postUrl = "Your URl" struct divisionList: Decodable, Identifiable { let id: Int let mesg: String let list: [FDivision] private enum CodingKeys: String, CodingKey { case id = "err_code" case mesg = "message" case list = "list" } } struct FDivision: Decodable, Hashable { let forestDivision: String private enum CodingKeys: String, CodingKey { case forestDivision = "ForestDivision" } init(data:String) { forestDivision = data } } class viewModal: ObservableObject { #Published var items = [FDivision]() func postData() { guard let serviceUrl = URL(string: postUrl) else { return } let parameters: [String: Any] = [ "method": "Your Method Name" var request = URLRequest(url: serviceUrl) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return } request.httpBody = httpBody request.timeoutInterval = 20 let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in if let response = response { print(response) } if let data = data { do { let json = try JSONSerialization.jsonObject(with: data, options: []) if let dictionary = json as? [String:Any] { if let arrList = dictionary["list"] as? [[String:Any]]{ for data in arrList{ let model = FDivision(data: data["ForestDivision"] as! String) self.items.append(model) } } } print(json) } catch { print(error) } } }.resume() } } Create Now New Swiftui File. import SwiftUI import UIKit struct DivisionList: View { #ObservedObject var vm = viewModal() var body: some View { NavigationView { VStack { List(vm.items, id: \.self) { item in Button(action: {}, label: { Text(item.forestDivision).foregroundColor(.customGreen) }) } }.navigationBarTitle("Data") .onAppear(perform: { vm.postData() }) } } } struct DivisionList_Previews: PreviewProvider { static var previews: some View { DivisionList() } }
Apple Maps Not Showing Map Overlay
I have a question regarding creating a Apple Map Overlay. I am trying to set on odd shape overlay from a JSON file. I have researched this on Stack Overflow, and have tried many of the solutions, but none seem to work. My code is below: import UIKit import MapKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UIGestureRecognizerDelegate { #IBOutlet weak var mapView: MKMapView! var coordinate: CLLocationCoordinate2D? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. mapView.showsUserLocation = true mapView.delegate = self mapView.mapType = .standard let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.TapGesture)) mapView.addGestureRecognizer(gestureRecognizer) } func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { if overlay is MKPolygon { let polygonView = MKPolygonRenderer(overlay: overlay) polygonView.strokeColor = UIColor.black polygonView.lineWidth = 0.5 polygonView.fillColor = UIColor.blue return polygonView } return MKOverlayRenderer() } #objc func TapGesture(gesRect: UITapGestureRecognizer) { let location = gesRect.location(in: mapView) coordinate = mapView.convert(location,toCoordinateFrom: mapView) let locCoord = mapView.convert(location, toCoordinateFrom: mapView) print("Tapped at lat: \(locCoord.latitude) long: \(locCoord.longitude)") print("Tapped at: \(location)") self.retreiveShape() { (full_shape) in if let shape = full_shape { let polygon = MKPolygon.init(coordinates: shape, count: shape.count) self.mapView.addOverlay(polygon) } else { print("ARRAY EMPTY") } } } func retreiveShape(completion: #escaping ([CLLocationCoordinate2D]?) -> ()) { let path = Bundle.main.path(forResource: "shape", ofType: "json") var coord_array = [CLLocationCoordinate2D]() do { let data = try Data.init(contentsOf: URL.init(fileURLWithPath: path!)) let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) if let dictionary = json as? [String: Any] { if let shape = dictionary["shape"] as? Array<Any> { for regions in shape { guard let region = regions as? Array<Array<Array<Double>>> else { print("NOT HAPPENING") return } for sections in region { for coord in sections { print("LATITUDE: \(coord[0])", "LONGITUDE: \(coord[1])") let coordinatesToAppend = CLLocationCoordinate2D(latitude: coord[0], longitude: coord[1]) coord_array.append(coordinatesToAppend) } } } completion(coord_array) } } } catch let error { print(error) } } The shape.json file is below: { "shape":[ [ [ [-81.621199, 30.282314], [-81.613987, 30.281941], [-81.611277, 30.284743], [-81.602735, 30.284026], [-81.601978, 30.292561], [-81.596275, 30.290861], [-81.592406, 30.290182], [-81.571146, 30.28763], [-81.55922, 30.286602], [-81.559148, 30.291132], [-81.558633, 30.294747], [-81.55881, 30.312887], [-81.558601, 30.312888], [-81.558622, 30.316235], [-81.558313, 30.316828], [-81.552252, 30.320252], [-81.548471, 30.321618], [-81.527882, 30.323989], [-81.529486, 30.328076], [-81.537635, 30.336704], [-81.537706, 30.337221], [-81.538717, 30.338277], [-81.539343, 30.338462], [-81.542809, 30.341686], [-81.547286, 30.345211], [-81.552498, 30.348839], [-81.552559, 30.352445], [-81.577566, 30.352039], [-81.578098, 30.353324], [-81.578161, 30.35642], [-81.577294, 30.3596], [-81.576996, 30.366609], [-81.58011, 30.366553], [-81.580875, 30.37062], [-81.580844, 30.373862], [-81.581462, 30.374486], [-81.578114, 30.374236], [-81.572908, 30.374611], [-81.562232, 30.372303], [-81.551965, 30.366559], [-81.548676, 30.365568], [-81.540187, 30.378172], [-81.538175, 30.380467], [-81.538213, 30.387239], [-81.536613, 30.388739], [-81.512612, 30.392739], [-81.505211, 30.390739], [-81.490911, 30.392139], [-81.49085, 30.389014], [-81.489978, 30.389207], [-81.488818, 30.38775], [-81.489203, 30.389266], [-81.487056, 30.390019], [-81.481446, 30.391262], [-81.479505, 30.39117], [-81.477708, 30.390635], [-81.476792, 30.390609], [-81.476244, 30.391002], [-81.473212, 30.389422], [-81.472125, 30.388436], [-81.472225, 30.388071], [-81.474072, 30.386758], [-81.475085, 30.384287], [-81.474394, 30.381898], [-81.473246, 30.38059], [-81.473337, 30.380112], [-81.47295, 30.379864], [-81.472643, 30.380053], [-81.471914, 30.379532], [-81.471629, 30.378346], [-81.470845, 30.377256], [-81.468671, 30.376016], [-81.466871, 30.374481], [-81.465402, 30.374424], [-81.464374, 30.373764], [-81.465116, 30.373015], [-81.467728, 30.372493], [-81.469102, 30.371435], [-81.470279, 30.369931], [-81.472008, 30.370608], [-81.473695, 30.370041], [-81.471862, 30.370238], [-81.470952, 30.369737], [-81.471715, 30.369462], [-81.470506, 30.369378], [-81.469456, 30.368207], [-81.468051, 30.367707], [-81.46754, 30.366828], [-81.466905, 30.366464], [-81.467432, 30.366219], [-81.466928, 30.365735], [-81.465222, 30.365136], [-81.464909, 30.364103], [-81.46316, 30.362764], [-81.463369, 30.36188], [-81.462197, 30.361235], [-81.461151, 30.36123], [-81.46117, 30.360531], [-81.461878, 30.360305], [-81.461619, 30.359642], [-81.461873, 30.358669], [-81.461645, 30.358376], [-81.460504, 30.358329], [-81.46288, 30.357969], [-81.462786, 30.357137], [-81.461247, 30.355282], [-81.460556, 30.352518], [-81.46184, 30.340222], [-81.462497, 30.339325], [-81.465064, 30.337897], [-81.471588, 30.328301], [-81.472988, 30.318258], [-81.469123, 30.319481], [-81.450496, 30.320896], [-81.443818, 30.302908], [-81.442451, 30.301512], [-81.438991, 30.299798], [-81.437921, 30.298031], [-81.437696, 30.284657], [-81.438134, 30.283427], [-81.439935, 30.281191], [-81.440578, 30.279729], [-81.440309, 30.276152], [-81.441217, 30.271746], [-81.440891, 30.270368], [-81.440247, 30.269313], [-81.438555, 30.267721], [-81.43765, 30.266188], [-81.43705, 30.257116], [-81.441869, 30.256519], [-81.45385, 30.252008], [-81.466184, 30.251073], [-81.472173, 30.251296], [-81.491372, 30.251034], [-81.507105, 30.253603], [-81.510744, 30.253761], [-81.530261, 30.250144], [-81.56957, 30.249854], [-81.584658, 30.251369], [-81.586895, 30.251326], [-81.589607, 30.250593], [-81.593308, 30.248471], [-81.605497, 30.260294], [-81.621493, 30.282334], [-81.621199, 30.282314] ] ] ] } It should create an odd shape overlay in the Southside of Jacksonville,FL, but it isn't. When the completion block is called the Coordinates are added to the array, but the map overlay isn't showing. Any thoughts?
Well this is somewhat embarrassing. I did as was suggested in the comments, and tried having the shape with nine vertices. It still didn't work. I then changed the coord from: print("LATITUDE: \(coord[0])", "LONGITUDE: \(coord[1])") let coordinatesToAppend = CLLocationCoordinate2D(latitude: coord[0], longitude: coord[1]) to: print("LATITUDE: \(coord[1])", "LONGITUDE: \(coord[0])") let coordinatesToAppend = CLLocationCoordinate2D(latitude: coord[1], longitude: coord[0]) It works perfectly. Turns out I had the Latitude and Longitude wrong.
Bad Request: there is no photo in the request
I'm trying to send an image from my application to telegram bot like here https://newfivefour.com/swift-form-data-multipart-upload-URLRequest.html Here is the code let BotToken = "12345" let ChatID = "123" func SendToTelegram() { var request = URLRequest(url: URL(string: "https://api.telegram.org/bot"+BotToken+"/sendPhoto")!) request.httpMethod = "POST" let boundary = "Boundary-\(UUID().uuidString)" request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") let params = [:] as [String: String] UIGraphicsBeginImageContextWithOptions(ScreenImage.bounds.size, true, 0.0) ScreenImage.image?.draw(in: CGRect(x: 0, y: 0, width: ScreenImage.frame.size.width, height: ScreenImage.frame.size.height)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() request.httpBody = createBody(parameters: params, boundary: boundary, data: UIImageJPEGRepresentation(image!, 0.7)!, mimeType: "image/jpg", filename: "hello.jpg") print(request.httpBody!) let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error return } do { let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? AnyObject if let parseJSON = json { print("resp :\(parseJSON)") } } catch let error as NSError { print("error : \(error)") } } task.resume() } and get an error Bad Request: there is no photo in the request"; "error_code" = 400; ok = 0; Where do i make a mistake? I'm new in SWIFT and sorry for my English
I know this question is old but the link provided pushed me in the right direction. This is my solution for server side Swift not iOS but you should be able to use it with minimal changes. Remember if you're using iOS, perform none of these operations on the main thread. class NetworkManager { func sendTelegramPhoto(_ photo: Data) { let url = "https://api.telegram.org/bot\(Constants.Telegram.token)/sendPhoto" let params: [String: Any] = [ "chat_id": Constants.Telegram.uid, "photo": photo ] let _ = sendMultiTypePostRequest(url, parameters: params) } private func sendMultiTypePostRequest(_ url: String, parameters: [String:String]) -> NetworkResponse { var networkResponse = NetworkResponse() let semaphore = DispatchSemaphore(value: 0) guard let url = URL(string: url) else { return networkResponse } var urlRequest = URLRequest(url: url) urlRequest.httpMethod = "POST" let boundary = "Boundary-\(UUID().uuidString)" urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") let httpBody = createBody(parameters: parameters, boundary: boundary, mimeType: "image/jpeg", filename: "snapshot.jpg") let config = URLSessionConfiguration.default config.requestCachePolicy = .reloadIgnoringLocalCacheData let session = URLSession(configuration: config) let task = session.uploadTask(with: urlRequest, from: httpBody) { (data, response, error) in networkResponse.data = data networkResponse.response = response networkResponse.error = error semaphore.signal() } task.resume() _ = semaphore.wait(timeout: .distantFuture) return networkResponse } private func createBody(parameters: [String: String], boundary: String, mimeType: String, filename: String) -> Data { var body = Data() let boundaryPrefix = "--\(boundary)\r\n" for (key, value) in parameters { if let data = value as? Data { body.appendString(boundaryPrefix) body.appendString("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n") body.appendString("Content-Type: \(mimeType)\r\n\r\n") body.append(data) body.appendString("\r\n") } else if let string = value as? String { body.appendString(boundaryPrefix) body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") body.appendString("\(string)\r\n") } } body.appendString("--".appending(boundary.appending("--"))) return body } } private extension Data { mutating func appendString(_ string: String) { let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false) append(data!) } }
Swift 3 , CollectionView, Alamofire 4 : finding nil while unwrapping a value
Here is my JSON response { "category_list" : [ { "category_imag" : "http:\/\/xxx\/wp-content\/uploads\/2016\/10\/img-thing.jpg", "category_name" : "category 1", "category_description" : "dsadsadas", "category_id" : 6 }, { "category_imag" : "http:\/\/xxx\/wp-content\/uploads\/2016\/09\/7075hp_2_2.jpg", "category_name" : "category 2", "category_description" : "dasdadasdas", "category_id" : 12 } ] } items are*********************************************** { "category_imag" : "http:\/\/xxx\/wp- content\/uploads\/2016\/10\/img-thing.jpg", "category_description" : "dsadsadas", "category_name" : "category 1", "category_id" : 6 } { "category_imag" : "http:\/\/xxx\/wp- content\/uploads\/2016\/09\/7075hp_2_2.jpg", "category_description" : "dasdadasdas", "category_name" : "category 2", "category_id" : 12 } items number*********************************************** 2 fatal error: unexpectedly found nil while unwrapping an Optional value (lldb) here is the function I am using to fetch JSON using Alamofire & SwiftyJSON func getJSON(){ let getEndPoint: String = "http://xxx/api/category_list/" Alamofire.request(getEndPoint) .responseJSON { response in guard response.result.error == nil else { // got an error in getting the data, need to handle it print("error calling GET") print(response.result.error!) return } if let value = response.result.value { let json = JSON(value) print(json) // print(json["main_content"].array) let categoryList = json["category_list"].arrayValue for items in categoryList { //self.productList += [HomeFeedJSON(items:items )] self.getCategoryList.append(CategoryList(items: items)) print(items) } print("items are***********************************************") print(self.getCategoryList.count) DispatchQueue.main.async { self.afData = 1 self.collectionView?.reloadData() } } } } and here is the model class I am using for assigning the values fetched from JSON import Foundation import SwiftyJSON class CategoryList { var category_name: String? var category_imag: URL? var category_description: String? init(items: JSON){ self.category_name = items["category_name"].stringValue self.category_imag = items["category_imag"].URL self.category_description = items["category_description"].stringValue } } I don't want to bother people but I have tried all possible way I could, its showing nil on my collectionViewCell . in numberOfItemsInSection I am getting intended result but at cellForItemAt indexPath it shows nil value and crashes. Here is my cellForItemAt indexPath override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CatagoryShopCell", for: indexPath) as! CatagoryShopCell if afData == 1 { let myCategory = self.getCategoryList[indexPath.row] cell.catagoryName.text = myCategory.category_name cell.catagoryDesc.text = myCategory.category_description let categoryImg = myCategory.category_imag SDWebImageManager.shared().downloadImage(with: categoryImg, options: [], progress: nil) { downloadedImage, error, cacheType, isDownloaded, url in cell.catagoryPicture.image = downloadedImage } } return cell } I have used the same function/model class in a tableView in it works just fine, but I can't sort it out how its not finding value in my model class here at collectionView . Please any kind person help. Thank you in advance.
Swift / How to parse json from java spring code
I want to parse json from java spring code (Xcode 7.3 / Swift). I tried almost every solution from all sites. When I register it gives the following error message at the console: Response = Optional(<NSHTTPURLResponse: 0x7a7607e0> { URL: http://www.____.com/saveRegistrationJson.htm } { status code: 405, headers { Allow = GET; Connection = "Keep-Alive"; "Content-Length" = 1089; "Content-Type" = "text/html;charset=utf-8"; Date = "Wed, 04 May 2016 12:21:34 GMT"; "Keep-Alive" = "timeout=15, max=100"; Server = "Apache-Coyote/1.1"; } }) before json Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.} This is my Code: import UIKit class RegistrationViewController: UIViewController { #IBOutlet weak var userfnametextfield: UITextField! #IBOutlet weak var userlnametextfield: UITextField! #IBOutlet weak var useremailtextfield: UITextField! #IBOutlet weak var userpwdtextfield: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } #IBAction func RegisterbtnTapped(sender: AnyObject) { let fname = userfnametextfield.text let lname = userlnametextfield.text let Email = useremailtextfield.text let pwd = userpwdtextfield.text //check empty fields if(fname!.isEmpty || lname!.isEmpty || Email!.isEmpty || pwd!.isEmpty ) { DisplayMyAlertMessage("All Fields are required") return } //store data NSUserDefaults.standardUserDefaults().setObject(fname, forKey: "fname") NSUserDefaults.standardUserDefaults().setObject(lname, forKey: "lname") NSUserDefaults.standardUserDefaults().setObject(Email, forKey: "Email") NSUserDefaults.standardUserDefaults().setObject(pwd, forKey: "password") NSUserDefaults.standardUserDefaults().synchronize() //send user data to server side let myurl = NSURL(string: "http://www.____.com/saveRegistrationJson.htm") let request = NSMutableURLRequest(URL: myurl!) request.HTTPMethod = "POST" let poststring = "fname\(fname!)&lname\(lname!)&email\(Email!)&password\(pwd!)" request.HTTPBody = poststring.dataUsingEncoding(NSUTF8StringEncoding) //request.HTTPBody = postData let task = NSURLSession.sharedSession().dataTaskWithRequest(request){data,response, error in if error != nil{ print("Error\(error)") return } print("Response = \(response)") do{ var err : NSError? print("before json") let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? NSDictionary print(json) print("After json") //print("demo : \(response?.description)") guard let parseJSON = json else{ print("parsing json here:") return } // guard let value = NSString(data: data!, encoding: NSUTF8StringEncoding) else{ // print("parsed") // return //} //print("FirstName\(value)") var requestValue = parseJSON[" "] as? String print("result:\(requestValue)") var isUserRegistered:Bool = false if(requestValue=="Success") { isUserRegistered = true} var messageToDisplay:String = parseJSON["Success"] as! String if(!isUserRegistered){ messageToDisplay = parseJSON[" "] as! String } dispatch_async(dispatch_get_main_queue(), { let myAlert = UIAlertController(title: "Alert", message: messageToDisplay, preferredStyle: UIAlertControllerStyle.Alert) let onAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { (ACTION) -> Void in self.dismissViewControllerAnimated(true, completion: nil) } myAlert.addAction(onAction) self.presentViewController(myAlert, animated: true, completion: nil) }) } catch let error as NSError { print(error) } } task.resume() Help is very appreciated.