2

Например, имеется такой Swift код:

 let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            var dann = NSString(data: data, encoding: NSUTF8StringEncoding)!
            self.str = dann
    })
task.resume()

Я хочу передать полученные данные в переменную в классе.
str - переменная в классе.
Строка "self.str = dann" не передает ничего. Как правильно сделать?

  • println("STR = (dann)") что пишет? Может там nil? сначала лучше проверить if let err = error { /* handler error / } else { / check & process response */ } – iFreeman Nov 14 '14 at 13:10
  • Ответ есть тут: https://ru.stackoverflow.com/questions/1358790/swift-Получение-данные-по-http/1358803#1358803 , ответ актуален на 9.12.2021 xcode 13.1 swift 5.5 – antipups Dec 08 '21 at 21:41

3 Answers3

1

dataTaskWithURL() имеет два аргумента

  1. url - url полученный с сервера
  2. completionHandler - функция, которая имеет 3 аргумента: data: NSData, response: NSURLresponce, error: NSError.

В аргументе data как раз и содержатся твои данные с сервера, которые ты запросил.

Но эти данные возвращаются в формате JSON (то есть, чтобы работать с ними, тебе надо их распарсить).

Тебе надо сделать примерно следующее:

var dann = []
 let task = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            let jsonResult = try! NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! NSDictionary
            if let result: NSArray = jsonResult["results"] as? NSArray
            {
                self.dann = result
                })
    })
αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
0

Корректно это обработать будет проблематично, так как этот NSURLSession по-умолчанию производит работу в фоне. Перед запуском задачи измени очередь, в которой будет выполняться задача на главный. Либо внутри цикла отправляй задачу на установку значения твоей переменной с главной очереди. Но это более гемморойно, так как нужно будет писать всякие обзерверы и так далее...

            task.privateQueueConcurrencyType = .mainQueueConcurrencyType
0

Пример с фрагментом ключевого кода для доступа к данным.

dataTask = defaultSession.dataTask(with: url) { data, response, error in
      defer { self.dataTask = nil }

Data По факту это стандартный переменная в URL которая автоматически сохраняет данные.