2015-06-19 2 views
42

Ниже мой код я получаю этот вопрос с:sendAsynchronousRequest осуждался в прошивке 9 Как изменить код, чтобы исправить

func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void) 
{ 
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, error) -> Void in 

     if ((error) != nil) 
     { 
      callback(feed: nil, error: error) 
     } 
     else 
     { 
      self.callbackClosure = callback 

      let parser : NSXMLParser = NSXMLParser(data: data!) 
      parser.delegate = self 
      parser.shouldResolveExternalEntities = false 
      parser.parse() 
     } 
    } 
} 

Это теперь устаревшая прошивка 9, и говорит мне использовать dataTaskWithRequest вместо. Может кто-то помочь мне изменить sendAsync с dataTask, я не знаю, как это сделать.

+1

Я думал, что NSURLConnection устарел в iOS8. Вы должны использовать NSURLSession с iOS7. – Fogmeister

+0

В чем проблема? У вас возникли проблемы с пониманием [документации] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/#//apple_ref/occ/instm/NSURLSession/dataTaskWithRequest:completionHandler :)? – DarkDust

+0

Да, я не знаю, как это сделать, чтобы использовать dataTaskWtihReqeust, я не знаю, что мне нужно изменить. –

ответ

69

Используйте NSURLSession вместо, как показано ниже,

для Objective-C

NSURLSession *session = [NSURLSession sharedSession]; 
[[session dataTaskWithURL:[NSURL URLWithString:"YOUR URL"] 
      completionHandler:^(NSData *data, 
           NSURLResponse *response, 
           NSError *error) { 
      // handle response 

    }] resume]; 

Для Swift,

var request = NSMutableURLRequest(URL: NSURL(string: "YOUR URL")!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    var params = ["username":"username", "password":"password"] as Dictionary<String, String> 

    request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: []) 

    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     print("Response: \(response)")}) 

    task.resume() 

Для асинхронно запрос от компании Apple docs

Как и большинство Небраска tworking API, API NSURLSession высоко асинхронный. Он возвращает данные одним из двух способов, в зависимости от методов . Вызов:

К блоку обработчика завершения, который возвращает данные в ваше приложение, когда передача завершается успешно или с ошибкой.

Вызов методов на пользовательский делегат при получении данных.

Вызов методов в пользовательском делетете при загрузке в файл завершен.

+0

Как вы выполняете асинхронный запрос? – Supertecnoboff

+1

@Supertecnoboff, я только что обновил свой ответ. Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо вопросы. –

+0

Я получаю ошибку в выражении & err: Дополнительный аргумент «ошибка» при вызове – Hack4Life

15

Свифт реализация

let session = NSURLSession.sharedSession() 
session.dataTaskWithRequest(request) { (data, response, error) -> Void in 

} 
+8

Не забывайте, что вам нужно вызывать 'resume()' на вашем 'dataTaskWithRequest', или он не будет делать что-нибудь. – memmons

9

Это быстрые версии 2.1:

let request = NSMutableURLRequest(URL: NSURL(string: "YOUR URL")!) 
let session = NSURLSession.sharedSession() 
request.HTTPMethod = "POST" 

let params = ["username":"username", "password":"password"] as Dictionary<String, String> 

request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(params, options: []) 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
print("Response: \(response)")}) 

task.resume() 
+1

Спасибо за обновление. Яблоки dev env начинают запутываться. Все устарело! – Vingtoft

0

Иллюстрация с примером, альтернативный код устаревания из:

sendAsynchronousRequest (_: queue: completHandler :) 'устарел в iOS 9.0: Us e [NSURLSession dataTaskWithRequest: completHandler:]

Протестировано и работает в Swift 2.1 и далее.

import UIKit 

class ViewController: UIViewController { 


    @IBOutlet var theImage: UIImageView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 


     let url = NSURL(string: "https://upload.wikimedia.org/wikipedia/commons/6/6a/Johann_Sebastian_Bach.jpg") 


     let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) -> Void in 

      if error != nil { 
       print("thers an error in the log") 
      } else { 

       dispatch_async(dispatch_get_main_queue()) { 
       let image = UIImage(data: data!) 
       self.theImage.image = image 

       } 
      } 

     } 

     task.resume() 

    } 

} 

// Отображает изображение на ViewControllers ImageView. Подключите выход из ImageView

4

Swift 2,0:

Старый (замените новыми ниже):

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, data, error) -> Void in 

// Code 

} 

Новое:

let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in 

// Code 

} 
task.resume() 
8

Swift 3.0

var request = URLRequest(url: URL(string: "http://example.com")!) 
request.httpMethod = "POST" 
let session = URLSession.shared 

session.dataTask(with: request) {data, response, err in 
    print("Entered the completionHandler") 
}.resume() 
0

Здесь SWIFT3.0 версия Nilesh Patel's Answer с данными JSONSerialised

let url = URL(string: "<HERE GOES SERVER API>")! 
      var request = URLRequest(url: url) 
      request.httpMethod = "POST" //GET OR DELETE etc.... 
      request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
      request.setValue("<ValueforAuthorization>", forHTTPHeaderField: "Authorization") 
      let parameter = [String:Any]() //This is your parameters [String:Any] 
      do { 
       let jsonData = try JSONSerialization.data(withJSONObject: parameter, options: .prettyPrinted) 
       // here "jsonData" is the dictionary encoded in JSON data 
       request.httpBody = jsonData 
       let session = URLSession(configuration: .default) 
       let task = session.dataTask(with: request, completionHandler: { (incomingData, response, error) in 
        if let error = error { 
         print(error.localizedDescription) 
         print(request) 
        }else if let response = response { 
         print(response) 
        }else if let incomingData = incomingData { 
         print(incomingData) 
        } 
       }) 
       task.resume() 

      } catch { 
       print(error.localizedDescription) 
      } 
1

с быстрым 3.1

let request = NSMutableURLRequest(url: NSURL(string: image_url_string)! as URL) 
    let session = URLSession.shared 
    request.httpMethod = "POST" 

    let params = ["username":"username", "password":"password"] as Dictionary<String, String> 

    request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: []) 

    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in 
     print("Response: \(String(describing: response))")}) 

    task.resume() 
0

Свифта 4

let params = ["email":"[email protected]", "password":"123456"] as Dictionary<String, String> 

var request = URLRequest(url: URL(string: "http://localhost:8080/api/1/login")!) 
request.httpMethod = "POST" 
request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: []) 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 

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

    do { 
     let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject> 
     print(json) 
    } catch { 
     print("error") 
    } 

}) 

task.resume() 
Смежные вопросы