Я новичок в программировании на 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()
}
Просмотр таблицы загружается со всеми нужными мне станциями, поэтому вызов функциисделал свою работу, но на карте нет аннотаций (я знаю, что моя функция аннотаций работает, и я ее вызываю, я просто удалил вызов здесь)