Stack Overflow на русском Asked by Caleb G on November 10, 2021
Я новичок в кодировании (любом кодировании на любом языке). В настоящее время у меня есть проект, который написан в SwiftUI. Теперь мне нужно добавить линейный график к нему. Я заметил, что в большинстве учебных пособий либо говорится о создании bar-чартов (которые по какой-то странной причине являются отраслевым стандартом), либо о создании графиков в UIKit. Итак, у меня несколько вопросов:
(1) Если бы я из-за отсутствия альтернативного выбора решил сделать линейный график в UIKit, смогу ли я интегрировать его в проект SwiftUI, который у меня есть сейчас?
(2) Можно ли создать динамический линейный график, который будет извлекать данные из API и соответствующим образом обновлять диаграмму при каждом обновлении информации в API? (Под «динамической» диаграммой я имею в виду именно это … не вставлять вручную координаты x и y каждый раз [именно так я примитивно предполагаю, что это работает], а автоматически, получая данные из API).
Это вообще возможно? И если да, то где мне нужно искать, что искать, с чего бы вы посоветовали начать?
Большое спасибо заранее, будьте здоровы!
Вот пример запроса и отображения линейного графика с помощью ChartView и сервиса для тестирования запросов https://jsonplaceholder.typicode.com. Здесь мы запрашиваем посты и отображаем в графике длину строк их заголовков
struct ContentView: View {
@ObservedObject var postsDatasource = PostsDatasource()
var body: some View {
LineChartView(
data: postsDatasource.titlesLengths,
title: "Titles Length",
legend: "Shows posts titles lengths",
form: ChartForm.extraLarge,
rateValue: 0)
.onAppear { self.postsDatasource.fetchTitlesLengths() }
}
}
Класс для запроса данных
class PostsDatasource: ObservableObject {
struct Post: Decodable {
var userId: Int
var id: Int
var title: String
var body: String
}
var titlesLengths: [Double] = [] {
didSet {
objectWillChange.send()
}
}
func fetchTitlesLengths() {
guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else {
return
}
URLSession.shared.dataTask(with: url) { (data, responce, error) in
if let error = error {
print(error.localizedDescription)
return
}
guard let data = data else {
print("No data")
return
}
guard let posts = try? JSONDecoder().decode([Post].self, from: data) else {
print("Unable to parse posts")
return
}
DispatchQueue.main.async {
self.titlesLengths = posts.map { Double($0.title.count) }
}
}.resume()
}
}
Answered by schmidt9 on November 10, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP