2015-08-11 3 views
0

У меня есть вопрос о NSURLSession Я скачал JSON данных с помощью NSURLSession Я хочу получить доступ к переменным данным JSON enter code here из вне этого блока кода, так что я манипулироватьSwift IOS, как получить результат NSURLSession

это мой код

// variable declared in my class 
var jsonData = JSON("") 

// my function 
func loadCategories(){ 

var url = NSURL(string: "http://localhost:8888/api/v1/getAllCategories") 

var request = NSMutableURLRequest(URL:url!) 

request.HTTPMethod = "GET" 

NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, errors: NSError!) in 

self.jsonData = JSON(data: data) 
}).resume() 
} 

Когда я пытаюсь получить jsonData вне блока NSURLSession я получаю пустой переменной

Любая помощь?

+0

Распечатайте jsonData внутри блока. Разве это не пусто? – dasdom

+0

внутри блока это не пусто, но позже в другом методе при его печати я получаю пустую переменную – rayzer

+0

Проверьте, вызывается ли вышеуказанный код перед кодом, в котором вы его читали. И убедитесь, что свойство не установлено где-то в другом месте. Убедитесь, что вы получаете доступ к jsonData в том же потоке. Может быть, у вас есть состояние гонки здесь. – dasdom

ответ

0

Проверьте, если вы получаете доступ к jsonData в том же потоке. Может быть, у вас есть состояние гонки здесь.

0

Проблема в том, что вы не понимаете, как работают функции async с блоками завершения.

Взгляните на мой ответ на эту тему. Я объясняю, что происходит в деталях:

Why does Microsoft Azure (or Swift in general) fail to update a variable to return after a table query?

(Не позволяйте название нити вводят вас в заблуждение Это не имеет ничего общего с Microsoft Azure.).

метод вы используете, dataTaskWithRequest вызывает завершение закрытия в очереди делегатов сеанса URL. Если вы не предоставили фоновой очереди в качестве очереди делегатов, вам не нужно беспокоиться о dispatch_async.

0

Я нашел решение пусть приоритет = DISPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async (dispatch_get_global_queue (приоритет, 0)) {self.jsonData = JSON (данные: данные) dispatch_async (dispatch_get_main_queue()) {self.collectionView reloadData()}}?

Смежные вопросы