-1

I have an error called EXC Bad Instruction. Could someone help me figure it out. The outlet panel says:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. fatal error: unexpectedly found nil while unwrapping an Optional value

Here is the code.

import Foundation

let kNotificationStocksUpdated = "stocksUpdated"

class StockManagerSingleton {

//Singleton Init
class var sharedInstance : StockManagerSingleton {
    struct Static {
        static let instance : StockManagerSingleton = StockManagerSingleton()
    }
    return Static.instance
}

/*!
* @discussion Function that given an array of symbols, get their stock prizes from yahoo and send them inside a NSNotification UserInfo
* @param stocks An Array of tuples with the symbols in position 0 of each tuple
*/
func updateListOfSymbols(stocks:Array<(String,Double)>) ->() {

    //1: YAHOO Finance API: Request for a list of symbols example:
    //http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN ("AAPL","GOOG","FB")&format=json&env=http://datatables.org/alltables.env

    //2: Build the URL as above with our array of symbols
    var stringQuotes = "(";
    for quoteTuple in stocks {
        stringQuotes = stringQuotes+"\""+quoteTuple.0+"\","
    }
    stringQuotes = stringQuotes.substringToIndex(stringQuotes.endIndex.predecessor())
    stringQuotes = stringQuotes + ")"

    let urlString:String = ("http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN "+stringQuotes+"&format=json&env=http://datatables.org/alltables.env").stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
    let url : NSURL = NSURL(string: urlString)!

    let request: NSURLRequest = NSURLRequest(URL:url)
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)

    //3: Completion block/Clousure for the NSURLSessionDataTask
    let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

        do {
            if let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options:.MutableContainers) as? NSDictionary {
                // Success block...
                //5: Extract the Quotes and Values and send them inside a NSNotification
                let quotes:NSArray = ((jsonDict.objectForKey("query") as! NSDictionary).objectForKey("results") as! NSDictionary).objectForKey("quote") as! NSArray
                dispatch_async(dispatch_get_main_queue(), {
                    NSNotificationCenter.defaultCenter().postNotificationName(kNotificationStocksUpdated, object: nil, userInfo: [kNotificationStocksUpdated:quotes])
                })
            }
        } catch {
            print(error)
        }

    })


    //6: DONT FORGET to LAUNCH the NSURLSessionDataTask!!!!!!
    task.resume()
}
}

The line with the problem in it is,

if let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options:.MutableContainers) as? NSDictionary 
Luc Mollard
  • 19
  • 1
  • 2
  • 7

1 Answers1

0

App Transport Security is causing your request to fail since you are requesting a url that does not use https. Then in the completion handler, data is nil which is probably what is causing the exception since you are force unwrapping it.

You'll need to add a check to make sure data is not nil before you try and use it to stop the exception.

To get the network request to work, you either need to use an https url or disable App Transport Security

Community
  • 1
  • 1
Craig Siemens
  • 12,942
  • 1
  • 34
  • 51