2015-09-28 4 views
3

Я пытаюсь изменить свой код с Swift 1.2 на Swift 2.0, но у меня возникли проблемы с «sendAsynchronousRequest», потому что он всегда показывает предупреждение, потому что он устарел. Я попытался использовать другое решение из этого сообщения: Cannot invoke 'sendAsynchronousRequest' in Swift 2 with an argument list, но он все еще не работает, и я снова получаю такое же предупреждение.sendAsynchronousRequest устарел в iOS 9

Что мне нужно изменить в своем коде для решения этого предупреждения? Предупреждение заключается в следующем:

sendAsynchronousRequest осуждался в прошивке 9, используйте dataTaskWithRequest: completionHandler

Это мой код:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    // try to reuse cell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MarcaCollectionViewCell 

    // get the deal image 
    let currentImage = marcas[indexPath.row].imagen 
    let unwrappedImage = currentImage 
    var image = self.imageCache[unwrappedImage] 
    let imageUrl = NSURL(string: marcas[indexPath.row].imagen) 

    // reset reused cell image to placeholder 
    cell.marcaImageView.image = UIImage(named: "") 

    // async image 
    if image == nil { 

     let request: NSURLRequest = NSURLRequest(URL: imageUrl!) 
     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse?,data: NSData?,error: NSError?) -> Void in 
      if error == nil { 

       image = UIImage(data: data!) 

       self.imageCache[unwrappedImage] = image 
       dispatch_async(dispatch_get_main_queue(), { 
        cell.marcaImageView.image = image 

       }) 
      } 
      else { 

      } 
     }) 
    } 

    else { 
     cell.marcaImageView.image = image 
    } 

    return cell 

} 
+1

Итак, вы хотите, чтобы подавить предупреждение или вы хотите, чтобы перейти к 'dataTaskWithRequest: completeHandler'? – Wain

+0

Привет @Wain, я хотел бы сделать все правильно, поэтому я предпочитаю подавлять предупреждение, если это правильно. Заранее спасибо. –

+1

Подавление предупреждения об устаревших методах - не очень хорошая идея. Просто перейдите к использованию NSURLSession, как предупреждает вас. – Abizern

ответ

10

Как предупреждает предупреждение, NSURLConnection мертв. Да здравствует NSURLSession.

let session = NSURLSession.sharedSession() 
let urlString = "https://api.yoursecureapiservergoeshere.com/1/whatever" 
let url = NSURL(string: urlString) 
let request = NSURLRequest(URL: url!) 
let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in 
    print("done, error: \(error)") 
} 
dataTask.resume() 
+0

Спасибо за ваш быстрый пример @ Keller, я изменил некоторые вещи из вашего кода, и теперь он работает без предупреждения. Очень признателен. –

+0

Не могли бы вы рассказать мне келлер, как я могу заставить контроллер pushview с прохождением словаря после получения ответа от webservice? – kalpesh

+0

либо добавьте аргумент словаря в ваш инициализатор контроллера вида, либо если вы используете раскадровку, сохраните словарь в свойстве и установите его в файле prepareForSegue. вы также должны убедиться, что вы нажимаете контроллер вида на основной поток. – Keller

1

Используйте 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> 

var err: NSError? 
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err) 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

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

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