Можно ли получить список объектов (который был создан из файла JSON) из другого класса? - PullRequest
0 голосов
/ 24 октября 2019

Я новичок в программировании на iOS, и у меня есть вопрос о том, как составить список из другого класса. Позвольте мне объяснить: я пытаюсь создать базовое приложение для велосипеда, которое позволяет пользователю видеть местоположение всех велосипедов на карте или в виде таблицы. При открытии приложения первым представлением является карта. Я хотел бы, чтобы карта была заполнена аннотацией. Вот в чем дело: в контроллере представления карты я вызываю fetchStationData (), который определен в моем классе контроллера представления таблицы, который заполняет глобальную переменную объектом велосипедной станции. Я хочу получить эту глобальную переменную на карте VC, чтобы поместить все мои аннотации. Другими словами: я хочу, чтобы мой stationList создавался только один раз при открытии приложения, и я хочу иметь возможность доступа к данным из этого списка в виде таблицы И на карте, я не хочу дважды загружать данные изФайл JSON.

Я попытался напечатать список объектов после извлечения данных, но ничего не получил.

// In Map VC file
override func viewDidLoad() {
        super.viewDidLoad()
        StationListScreen().fetchStationData()
    }

private func setUpAnnotation() {
        for station in StationListScreen.stationsList {
            let location = station.location
            let annotation = MKPointAnnotation()
            annotation.title = station.stationName
            annotation.coordinate = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)
            mapView.addAnnotation(annotation)
        }
    }

// In StationListScreen class
// Global var declaration

static var stationsList = [Station]()

// Fetching data function

func fetchStationData() {

        let locationManager = CLLocationManager()
        let location = locationManager.location

        var allStations = [Station]()

        let jsonStringUrl = URL(string: "https://opendata.paris.fr/api/records/1.0/search/?dataset=velib-disponibilite-en-temps-reel&rows=2000")

        URLSession.shared.dataTask(with: jsonStringUrl!) { (data, response, error) in
            guard let data = data else { return }

            do {
                guard let jsonObject = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] else { return }
                guard let recordsObjects = jsonObject["records"] as? [[String: AnyObject]] else { return }
                for recordObject in recordsObjects {
                    if let fields = recordObject["fields"] as? [String: AnyObject],
                        let nbFreeEDock = fields["nbfreeedock"] as? Int,
                        let nbBikes = fields["nbbike"] as? Int,
                        let nbEBikes = fields["nbebike"] as? Int,
                        let stationName = fields["station_name"] as? String,
                        let geo = fields["geo"] as? [CLLocationDegrees]
                    {
                        allStations.append(Station(stationName: stationName,nbBikes: nbBikes, nbEBikes: nbEBikes, nbFreeDocks: nbFreeEDock, location: Location(latitude: geo[0], longitude: geo[1]), distance: Int(location!.distance(from: CLLocation(latitude: geo[0], longitude: geo[1]))) / 1000))
                    }
                }
                DispatchQueue.main.async {
                    StationListScreen.self.stationsList = allStations
                }
            }
            catch {
                return
            }
        }.resume()
    }

Просмотр таблицы загружается со всеми нужными мне станциями, поэтому вызов функциисделал свою работу, но на карте нет аннотаций (я знаю, что моя функция аннотаций работает, и я ее вызываю, я просто удалил вызов здесь)

Ответы [ 2 ]

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

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

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

Используйте для этой цели одноэлементный класс. Храните данные станций в этом одноэлементном классе и используйте их в TableViewController и в вашем классе MapView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...