2016-12-09 4 views
2

Я использую AFNetworking с Swift 3.0, и я застрял на одном коде.Swift 3 using AFNetworking

func getJSON() 
    { 


     let manager = AFHTTPSessionManager() 
     manager.get(
      url, 
      parameters: nil, 
      success: 
      { 
       (operation: URLSessionTask!, responseObject: Any?) in 

       print("JSON: " + responseObject!.description) 
       self.matchesArray = responseObject!.object(forKey: "matches")! as? NSMutableArray 
       self.tollBothPlazaTableView.reloadData() 
      }, 

      failure: 
      { 
       (operation: URLSessionTask!, error: NSError) in 
       print("Error: " + error.localizedDescription) 
      } 
     ) 
    } 

Показаны ошибки failure блок.

Невозможно преобразовать значение типа '(URLSessionTask !, NSError) ->()' ожидаемого типа аргумента '((URLSessionDataTask ?, ошибка) -> Пустота)? `

Может кто-то

объясните, что не так в моем коде. Также правильный способ использования закрытий? (Я новичок в быстром).

ответ

9

Ошибка явно говорит о том, что использование Error вместо NSError, в Swift 3 вам необходимо использовать Error вместо NSError. Поэтому измените свой код, как показано ниже.

func getJSON() { 

    let manager = AFHTTPSessionManager() 
    manager.get(
     url, 
     parameters: nil, 
     success: 
     { 
      (operation, responseObject) in 

      if let dic = responseObject as? [String: Any], let matches = dic["matches"] as? [[String: Any]] { 
        print(matches) 
      } 
      DispatchQueue.main.async {       
       self.tollBothPlazaTableView.reloadData() 
      } 
     }, 
     failure: 
     { 
      (operation, error) in 
      print("Error: " + error.localizedDescription) 
    }) 
} 

Примечание: Всегда выполнять изменения пользовательского интерфейса на основном потоке, когда вы находитесь на фоне потока, так долбить, чтобы перезагрузить tableView на главном потоке, как я сделал, также использовать Swift родной Array и Dictionary вместо NSArray и NSDictionary.

+0

Спасибо. Это решило это. Так должен ли я объявлять массив как массив, а не NSMutableArray? –

+0

@ thewarri0r9 Приветствую вас, объявляйте ваш массив как массив словаря, например, мой ответ, если он содержит словарь типа 'var matchesArray = [[String: Any]]()', объявляет его как массив String, если он содержит String как 'var matchesArray = [String]() ' –

3

** Его лучше использовать Alamofire (тот же разработчик) в быстром 3 **

func jsonRequest() 
{ 

    let url = "url" 
    //if you want to add paramter 
    parametr = ["username" : "user" , "password"] 


    Alamofire.request(url, method: .post, parameters: nil, encoding: JSONEncoding.default) 
     .responseJSON { response in 
      // print(response) 
      //to get status code 
      if let status = response.response?.statusCode { 
       switch(status){ 
       case 201: 
        print("example success") 
       default: 
        print("error with response status: \(status)") 
       } 
      } 

      //to get JSON return value 
      if let array = response.result.value as? //NSDictionary [[String : Any]] 
      { 


      } 
    } 

} 
+1

Спасибо, но я думаю, что буду придерживаться AFNetworking :) –

+0

нормально не проблема, но попробуйте Alamofire лучше, чем Afnetworing :-) Happy Coding – seggy

+0

Но если у вас есть гибридный проект, имеющий две рамки, которые делают то же самое не всегда желательно. AlamoFire лучше, и мы используем его в нашем проекте Swift-only/most, но если у вас есть 90% ObjC - его просто не практично. – AlexK