2015-03-31 1 views
1

Как получить данные с сервера (серверное эхо - это как JSON), используя NSURLSession наиболее эффективным способом?Лучшая практика использования NSURLSession для получения данных с сервера на фоне (а не на главной панели)

Пример:

Я пытаюсь использовать ленту новостей Instagram в качестве сохранения шаблона. Они показывают 10 изображений, а затем он загрузит еще 10 (с сервера), когда вы вытащите и не заблокируете пользователя (они получают/загружают его на фоне - пока пользователи все еще используют приложение).

Я хочу сделать то же самое самым эффективным способом. В моем примере экран замораживается до тех пор, пока не будут получены данные. Как я могу избежать блокировки пользователя?

var imgurl = "http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg" 
     var sessionConfog =  NSURLSessionConfiguration.defaultSessionConfiguration() 
     var sessions : NSURLSession = NSURLSession(configuration: sessionConfog, delegate: nil, delegateQueue: nil) 
     var getImageTask = sessions.downloadTaskWithURL(NSURL(string: imgurl)!, completionHandler: { (location : NSURL!, response : NSURLResponse!, error : NSError?) -> Void in 
      var image : UIImage = UIImage(data: NSData(contentsOfURL: location)!)! 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.iamgeview.image = image 
       let m = self.saveImage(image, path: self.documentsDirectory()) 
       println(m) 
      }) 
     }) 
     getImageTask.resume() 

ответ

0

EDIT:

Я только что заметил, вы не используете NSURLSession правильно! В вашем блоке завершения я вижу следующее:

var image : UIImage = UIImage(data: NSData(contentsOfURL: location)!)! 

НЕ ДЕЛАЙТЕ это. Задача загрузки NSURLSession уже загружала данные для вас, вам не нужно ее снова загружать с помощью метода 'contentsOfURL'. Также этот метод является синхронным и блокирует вызывающий поток до тех пор, пока не будет загружено содержимое URL-адреса. Вы не должны использовать этот метод для создания сетевых URL-адресов.

Что вам нужно сделать, это реализовать методы делегирования для задачи загрузки, чтобы вы могли получить данные по завершении. Для вас проще использовать dataTaskWithURL: completeHandler - для этого сообщения обработчик завершения получает NSData из ответа.

END EDIT

Вы используете NSURLSession правильно, но если вы профилирование приложения, скорее всего, вы увидите, что наиболее дорогостоящую операцию здесь, и, вероятно, тот, который блокирует поток пользовательского интерфейса, является:

let m = self.saveImage(image, path: self.documentsDirectory()) 

Если вы можете сохранить свое изображение в отдельной последовательной очереди, то вы увидите значительное улучшение.

+0

Но это не то, что мне нужно через NSURLSession, мне нужно сделать самую простую вещь, которая в какой-то момент мне очень сложно сделать: у меня есть url, что echos JSON массив, я хочу получить его с помощью NSURLSession и «разобрать» его поэтому я могу использовать его, все это должно происходить на заднем плане (а не на переднем плане), можете ли вы направить меня к этому? –

+1

API NSURLSession по определению является асинхронным. Поэтому вам не нужно явно отправлять эту операцию в фоновый поток. Избегайте создания нескольких объектов NSURLSession, используйте один общий сеанс и выполняйте сохранение в галерее в фоновом режиме. – Xcoder

+0

Im ищет ответ для этого, а также. Можете ли вы показать пример кода о том, как извлечь DATA с сервера, используя его? –