Как заставить Swift дождаться завершения предыдущего кода? - PullRequest
0 голосов
/ 25 января 2019

Я только начал изучать Swift, я работаю с API позади, проблема в том, что: Swift не ждет завершения моей функции, поэтому моя последняя функция выглядит так, как будто код не был выполнен до .

import Foundation
import UIKit
import Alamofire
import SwiftyJSON

// Classes
class User {

    init(data: Any) {
        self.sex = JSON(data)["sex"].string!
        print(self.sex)
    }

    var id: Int = 1
    var online: Bool = false
    var picture: String = ""
    var sex: String = "Male"
}

// Fonctions
func getBackground(_ apiURL: String, completion : @escaping(_ :Any) -> Void) {
    // Requête API avec Alamofire + SwiftyJSON
    AF.request(apiURL, method: .get).validate().responseJSON { response in
        switch response.result {
        case .success(let value):
            let jsonData = JSON(value)
            completion(jsonData["results"])
        case .failure(let error):
            print(error)
        }

    }
}

// Requête de connexion
getBackground("https://x..me", completion: { response in
    let user = User(data: response)
})

print(String(user.id) + ": " + String(user.online!))

Скриншот здесь

У меня есть эта ошибка: «Использование неразрешенного идентификатора« пользователь »», я думаю, что Swift не понимает тот факт, что пользователь был определен ранее

Вся моя работа отлично работает с моим API, «self.sex» устанавливается и показывается при сборке кода. Но я все еще «заперт», как будто ничего не могу сделать после этого кода, потому что Свифт не хочет ждать.

Я попробовал функцию асинхронизации и синхронизации, но затем весь мой следующий код должен быть под функцией ...

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Нет необходимости ждать.

Поместите строку print - и код, который следует пользователю - в завершение закрытие

getBackground("https://a.clet.me", completion: { response in
    let user = User(data: response)
    print(String(user.id) + ": " + String(user.online!))
})

Ошибка Use of unresolved identifier 'user' возникает из-за того, что локальная переменная user видна только внутри области видимости ({}) ее объявления.

0 голосов
/ 25 января 2019

Итак, эта проблема связана с жизненным циклом переменных.

// This happens first

getBackground("https://a.clet.me", completion: { response in
    let user = User(data: response)

    // This happens third, once the request has completed.

    // user exists here.
    // Only after this moment you should handle anything related to the user
})

// This happens second

// user DOESN'T exist here, swift will move on 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...