Назначение переменной класса не работает внутри блока запроса Alamofire - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь присвоить результат запроса Alamofire переменной класса TableView.

Я понял, что когда я использую переменную self.notifications в блоке запроса Alamofire, это работает. Но когда я вызываю self.notifications за пределами Alamofire, это ноль, и self.notifications не назначается по ссылке. Кажется, что переменная копирования

class NotificationsTableView: UITableViewController{

    var notifications: Notification!
    let uri = Helper.URLDEV + "/api_x/notifications/"
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.cellLayoutMarginsFollowReadableWidth = true
        self.tableView.delegate = self
        self.tableView.dataSource = self
        print("Table loaded")
        let auth_code = ["Authorization": "Token " + Helper.getMyToken() ]
        Alamofire.request(self.uri, parameters: nil, encoding: URLEncoding.default, headers: auth_code).responseJSON { response in
            guard let data = response.data else { return }
            do {
                let decoder = JSONDecoder()
                //This is working properly
                self.notifications = try decoder.decode(Notification.self, from: data)
                print(self.notifications?.results?[2].notificationData?.body ?? 999)

            } catch let error {
                print(error)
            }
        }
        print("URI: \(uri)")
        //Here is just nil, if I didn't assign a value before
        print(self.notifications == nil)

Я ожидаю, что self.notification не будет nil после Alamofire request

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Код в ответе alamofire будет выполнен при получении какого-либо ответа от URL.Здесь указатель выполнения не будет ожидать этого ответа, поскольку это асинхронный обратный вызов, и продолжит выполнение следующего оператора.Таким образом, он сначала выполнит оператор вне Alamofire, и поскольку он не инициализируется ни с каким значением, он будет равен нулю, и после получения некоторого ответа переменной класса будет присвоено какое-то значение.

Ниже будет ссылкачтобы получить через асинхронный код

https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f

0 голосов
/ 17 мая 2019

Наконец, проблема решается с помощью синхронизации Alamofire из этого репо и даже с более чистым кодом.

...