2016-11-22 3 views
1

Прежде чем вы прочитаете это, пожалуйста, поймите, что я немного начинаю с Swift, и я пытаюсь учиться. Я просматривать несколько сайтов в надежде получить ответ, но я либо не может найти или сделать это неправильно .. Я после этого учебника, но это старый и не обновлял >>Tutorial I followed < <URLSession & JSONSerialization Swift 3

Я также попытался изменить некоторые на быстрые 3 - хотя я, вероятно, не сделал это правильно.

Как правильно правильно настроить URLSession? Я получаю эту ошибку:

invalid conversion from throwing function of type'(_, _, _) throws -> Void' to non-throwing function type

для этой строки ниже:

let task : URLSessionDataTask = session.dataTask(with: request, completionHandler: {data, response, error -> Void in

и для переменной "jsonDict" - я получаю ошибку, что у меня есть

extra arg 'error' in call.

Заранее спасибо

var 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").addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! 

    var url : URL = URL(string: urlString)! 
    var request: URLRequest = URLRequest(url:url) 
    let config = URLSessionConfiguration.default 
    let session = URLSession(configuration: config) 

    let task : URLSessionDataTask = session.dataTask(with: request, completionHandler: {data, response, error -> Void in 

     if((error) != nil) { 
      println(error.localizedDescription) 
     } 
     else { 
      var err: NSError? 

      var jsonDict = try JSONSerialization.JSONObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers, error: &err) as NSDictionary 
      if(err != nil) { 
       println("JSON Error \(err!.localizedDescription)") 
      } 
      else { 
       var quotes:NSArray = ((jsonDict.objectForKey("query") as NSDictionary).objectForKey("results") as NSDictionary).objectForKey("quote") as NSArray 
       DispatchQueue.main.async(execute: { 
        .default.post(name: Notification.Name(rawValue: kNotificationStocksUpdated), object: nil, userInfo: [kNotificationStocksUpdated:quotes]) 
       }) 
      } 
     } 
    }) 
    task.resume() 
} 
+0

его должно быть 'вар jsonDict = попробовать JSONSerialization.JSONObject (с: данными, опции: JSONSerialization.ReadingOptions.mutableContainers) как NSDictionary', в стремительном аргументе-ошибок удалены – Vinodh

+0

@Vinodh - Спасибо, я не думал, что все будет так просто. – zya

+0

Опубликовать в качестве ответа он будет полезен для других – Vinodh

ответ

1

Вы можете найти обновленный код для Swift 3.0

var 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").addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)! 

     let url : URL = URL(string: urlString)! 
     let request: URLRequest = URLRequest(url:url) 
     let config = URLSessionConfiguration.default 
     let session = URLSession(configuration: config) 

     let task = session.dataTask(with: request) { (data, response, error) in 

      if(error != nil){ 
       print(error?.localizedDescription ?? "") 
      } 
      else{ 
       do{ 
        let jsonDict:NSDictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary 
        let quotes:NSArray = ((jsonDict.object(forKey: "query") as! NSDictionary).object(forKey: "results") as! NSDictionary).object(forKey: "quote") as! NSArray 
        print(quotes) 

       } 
       catch{ 
        print(error.localizedDescription) 
       } 
      } 
     }; 
     task.resume() 

Примечание: Я не проверял код. Так как вы не указали аргументы URL

+0

кажется, что установил его, я думаю. Благодаря! и когда вы имеете в виду аргументы URL ... вот так? '/http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes где символ IN (« AAPL »,« GOOG »,« FB ») и формат = json & env = http: // datatables.org/alltables.env' – zya

+0

да, вы правы, я не знаю, что вы проходите в 'stringQuotes', теперь вы упомянули в комментарии. спасибо – Vinodh

+0

еще одно изменение i добавил метод кодирования url должен быть 'urlFragmentAllowed' не' urlHostAllowed', если я использую 'urlHostAllowed' am неспособный достигнуть yahoo api – Vinodh

0

Ваша проблема не в URLSessionDataTask, но в вашем completionHandler. Более конкретно в бит var jsonDict = try JSONSerialization.... try указывает, что ваш код может генерировать исключение, но вы его не обрабатываете (catch). Вот почему компилятор решает, что ваш обработчик завершения имеет тип (_, _, _) throws -> Void, а dataTask метод ожидает (_, _, _) -> Void.

Here вы можете найти информацию, как использовать try/catch.

+0

Я пытался, но я продолжал делать ошибки, поэтому Я здесь прошу о помощи. оригинал код URLSession это ** пусть задача: NSURLSessionDataTask = session.dataTaskWithRequest (запрос, completionHandler: {данные, ответ, ошибка -> Пустота в ** – zya

+0

, что решить эту проблему для меня ' сделать { вар josnDict = попробовать JSONSer ... ... }) } поймать { // ошибка ручки } ' – Valdmer

Смежные вопросы