как изменить переменную после изменения данных в swift - PullRequest
0 голосов
/ 27 октября 2019

Я использую API, чтобы узнать, как работает API, и я написал функцию, которая берет данные из Интернета и анализирует их в моей модели, но когда я хочу напечатать что-нибудь из этой модели, это не работает, кроме как в моей функции,

import UIKit

class MovieDetailViewController: UIViewController {

    var selectedMovie : Int?
    var movieDetail : MovieDetailModel? = nil

override func viewDidLoad() {
    super.viewDidLoad()
    getMovioesDetail(url: "\(URLs().baseURL)/movie/\(selectedMovie!)\(URLs().API_key)")
    print(movieDetail?.backdrop_path)
    // It does not print the path
}

//MARK: - Functions

func getMovioesDetail (url: String) {
    WebServices().get(url) { (type, model : MovieDetailModel?) in
        switch type {
        case .Succeed :
            self.movieDetail = model
            print(self.movieDetail?.backdrop_path)
            // It prints the path
        case .Failed : print("Failed")
        case .FailedDecode : print("FailedDecode")
        default : break
        }
    }
}
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

как @ Аарон Цирман заявил, что ваша функция включает вызов веб-службы, и веб-служба работает асинхронно, что означает, что она не известна, когда вы получите ответ.

Вот почему, если вы хотите что-то распечатать или перезагрузить представление таблицы / коллекции, сделайте это в случае .Succeed;не сразу после вызова вашей функции.

Также вам лучше сделать нулевую проверку вашего класса модели после его заполнения.

Просто чтобы показать пример:

case .Succeed:
    self.movieDetail = model
    if self.movieDetail != nil{
        print(movieDetail!.backdrop_path)
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
break
0 голосов
/ 27 октября 2019

Не зная больше о WebServices, трудно понять.

Я предполагаю, что WebServices().get(url) работает асинхронно в другом потоке, поэтому замыкание вызывается, когда запрос API возвращает данные, и поэтому печать работает.

Когда вы выполняете код в viewDidLoad, он запускается в главном потоке. Сразу после вызова getMovioesDetail, print(movieDetail?.backdrop_path) выполняется, и, скорее всего, movieDetail по-прежнему nil, поскольку WebService еще не завершен.

Для определенного изменения:

print(movieDetail?.backdrop_path)

с этим:

print(movieDetail?.backdrop_path ?? "Movie detail not available yet")

Если веб-служба работает очень быстро, вы увидите путь, напечатанный два раза, если нет, то сначала Детали фильма пока недоступны изатем путь.

...