Swift получает данные из сервиса в модели представленияIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Swift получает данные из сервиса в модели представления

Сообщение Anonymous »

Я новичок в Swift, использую ViewModel и пытаюсь получить данные из API, который я настроил локально, следующим образом:

Код: Выделить всё

//
//  LocationsViewModel.swift
//
//

import Foundation
import MapKit
import SwiftUI

class LocationsViewModel: ObservableObject {

// all loaded locations
@Published var locations: [Location]

// Current location on map

@Published var mapLocation: Location {
didSet {
updateMapRegion(location: mapLocation)
}
}

// current region on map
@Published var mapRegion: MKCoordinateRegion = MKCoordinateRegion()

// show list of locations
@Published var showLocationsList: Bool = false

// show location detail via sheet
@Published var sheetLocation: Location? = nil

let mapSpan = MKCoordinateSpan(
latitudeDelta: 0.1,
longitudeDelta: 0.1
)

init() {
LocationsDataService.fetch()
let locations = LocationsDataService.locations
self.locations = locations
self.mapLocation = locations.first!

self.updateMapRegion(location: locations.first!)

}

private func updateMapRegion(location: Location) {
withAnimation(.easeInOut) {
mapRegion = MKCoordinateRegion(
center: location.coordinates,
span: mapSpan
)
}
}

func toggleLocationsList() {
withAnimation(.spring()) {
showLocationsList.toggle()
}
}

func showNextLocation(location: Location) {
withAnimation(.easeInOut) {
mapLocation = location
showLocationsList = false
}
}

}
Однако в следующих двух строках возникает ошибка;

Код: Выделить всё

    LocationsDataService.fetch()
let locations = LocationsDataService.locations
А именно:

Выборка члена экземпляра не может использоваться для типа «LocationsDataService»; вы хотели вместо этого использовать значение этого типа?


Местоположения членов экземпляра нельзя использовать для типа LocationsDataService '; вы хотели вместо этого использовать значение этого типа?

Моя служба данных выглядит следующим образом:

Код: Выделить всё

//
//  LocationsDataService.swift
//

import Foundation
import MapKit

class LocationsDataService {
let token = "2|asOnUG27uCrcVuGxOO65kS25mX0nUSls5ApfemQy";
@Published var locations: [Location] = []

func fetch() {
guard let url = URL(string: "http://localhost:8080/api/locations") else {
print("Invalid url...")
return
}
var urlRequest = URLRequest( //2
url: url
)
urlRequest.setValue( //3
"Bearer \(token)",
forHTTPHeaderField: "Authentication"
)
urlRequest.setValue( //4
"application/json;charset=utf-8",
forHTTPHeaderField: "Content-Type"
)

let task = URLSession.shared.dataTask(with: urlRequest) { [weak self] data, _, error in
guard let data = data, error == nil else {
return
}

do {
let apiLocations = try JSONDecoder().decode([Location].self, from: data)
DispatchQueue.main.async {
self?.locations = apiLocations
}
} catch {
print(error)
}

}
task.resume()

}

}
Это моя модель местоположения;

Код: Выделить всё

//
//  Location.swift
//
//

import Foundation
import MapKit
import CoreLocation

struct Location: Identifiable, Equatable, Codable {

static func == (lhs: Location, rhs: Location) ->  Bool {
return lhs.id == rhs.id
}

let name: String
let cityName: String
//    let coordinates: CLLocationCoordinate2D
let description: String
let imageNames: [String]
let link: String
var id: String {
// create computed variable for id
name + cityName
}
let latitude: Double
let longitude: Double

var coordinates: CLLocationCoordinate2D {
return CLLocationCoordinate2D(latitude: CLLocationDegrees(latitude), longitude: CLLocationDegrees(longitude))
}
}
Есть идеи, как получить данные из API в моем классе обслуживания и использовать их в LocationsViewModel?

Подробнее здесь: https://stackoverflow.com/questions/711 ... view-model
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»