JSON синтаксический анализ в Swift - данные недоступны вне закрытия - PullRequest
0 голосов
/ 27 мая 2020

Я новичок в Swift, так что это может быть очень глупый вопрос:

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


import UIKit
import SwiftUI



var numerolokas : Int = 0

// Function to Get all the XXX´s ID´s

func getLokasIds(completion: @escaping ([Int]) -> Void ){


    let headers = [
    "Content-Type": "application/json",
    "Authorization": "Bearer xxxxx"]
    let Url = String(format: "http://xxxx")
    let serviceUrl = URL(string: Url)
    var request = URLRequest(url: serviceUrl!)
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) -> Void in
        if let data = data {
            do {
                let lokas_ids =  try JSONDecoder().decode([Int].self, from: data)
                completion(lokas_ids)
            }
            catch {
                print(error)
            }
        }
        }
        .resume()

}

Затем в коде я вызываю функцию


    getLokasIds  {

        (lokas_ids) in

       numerolokas = lokas_ids.count
       print(numerolokas)
}

Пока все хорошо, но если, например, я хотел бы использовать переменную numeroLokas за пределами этого закрытия он пуст, и я не понимаю, почему и как это можно сделать, чтобы он был доступен.

1 Ответ

2 голосов
/ 27 мая 2020

Вы используете обработчик завершения для обновления значения numerolokas. Вызовы API являются асинхронными, т.е. код продолжит выполнение, переведет вызов API в фоновый режим и перейдет к следующим строкам кода.

Код в скобках в getLokasIds { } будет вызываться после получения ответа API. Итак, здесь вы можете обновить значение numeroLokas. Но если вы попытаетесь вызвать numeroLokas за пределами getLokasIds, то вы можете получить или не получить желаемый результат в зависимости от того, был ли запрос API выполнен или нет.

getLokasIds  { 

    (lokas_ids) in

   numerolokas = lokas_ids.count
   print(numerolokas) // this will show correct value as its being updated after receiving response from api
}

Теперь,

getLokasIds  {

    (lokas_ids) in

   numerolokas = lokas_ids.count
   print(numerolokas) // shows correect value
}
print(numerolokas) // this print statement is outside the getLokasIds function and will show 0 as result because the api is still executing in background and numerolokas value is not updated yet.  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...