SwiftUI ViewModel не деиницируется и вызывает утечку памятиIOS

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

Сообщение Anonymous »

Я разрабатываю приложение для Mac OS на Xcode, которое извлекает футбольную турнирную таблицу из API и отображает ее в представлении. Я заметил, что моя память продолжает увеличиваться, и после использования графика памяти Xcode я считаю, что моя проблема в том, что ViewModel не деинитизируется и, следовательно, все еще выделяется память. Например, на рисунке ниже при трехкратном переходе от BundesligaView вперед и назад были созданы 3 отдельные модели.
Изображение

Приведенный ниже код значительно упрощен по сравнению с моим исходным приложением. При переходе из LeagueIndex -> BundesligaView создается viewModel. Я не уверен, стоит ли мне где-нибудь добавить [слабое я]?
// VIEWMODEL
import Foundation

class BundesligaViewModel: ObservableObject {
@Published var standings: [BundesligaModel] = []
@Published var loadingState: LoadingState = .idle

@MainActor
func fetchData(_ league: String? = nil) async {
loadingState = .loading
do {
standings = try await NetworkManager.shared.fetchBundesligaStandings(league!)
loadingState = .loaded
} catch {
print("Error fetching standings: \(error)")
loadingState = .error
}
}

init() {
print("VIEWMODEL CREATED")
}

deinit {
print("VIEWMODEL DEINT")
}
}

enum LoadingState {
case idle
case loading
case loaded
case error
}

// MODEL
import Foundation

struct BundesligaModel: Codable {
let teamName: String
let shortName: String
let points: Int
let matches: Int
let won: Int
let draw: Int
let lost: Int
let goals: Int
let opponentGoals: Int
let goalDiff: Int
}

// VIEWS
struct LeagueIndex: View {
var body: some View {
NavigationStack {
NavigationLink(destination: BundesligaTable(league: "Bundesliga")) {
Text("Bundesliga")
}
.buttonStyle(PlainButtonStyle())
}
.navigationBarBackButtonHidden(true)
}
}

struct Footer: View {
var body: some View {
NavigationLink(destination: LeagueIndex()) {
Text("League Index").foregroundStyle(Color.red)
}
.buttonStyle(PlainButtonStyle())
}
}

struct BundesligaTable: View {
let league: String
@StateObject private var viewModel = BundesligaViewModel()

let columns = [
GridItem(.fixed(25)),
GridItem(.flexible()),
GridItem(.fixed(25)),
GridItem(.fixed(25)),
GridItem(.fixed(25)),
GridItem(.fixed(25)),
GridItem(.fixed(25)),
GridItem(.fixed(25)),
GridItem(.fixed(25)),
GridItem(.fixed(25))
]

var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 10) {
ForEach(Array(viewModel.standings.enumerated()), id: \.element.teamName) { index, team in
Text("\(index + 1)")
Text(team.shortName)
Text("\(team.matches)")
Text("\(team.won)")
Text("\(team.draw)")
Text("\(team.lost)")
Text("\(team.goals)")
Text("\(team.opponentGoals)")
Text("\(team.goalDiff)")
Text("\(team.points)")
}
}
Footer()
}
.padding(.horizontal)
.task {
await viewModel.fetchData(league)
}
}
}

// NETWORK MANAGER

class NetworkManager {
static let shared = NetworkManager()

func fetchData(from endpoint: String) async throws -> T {
guard let url = URL(string: endpoint) else {
throw URLError(.badURL)
}

let (data, response) = try await URLSession.shared.data(from: url)

guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
throw URLError(.badServerResponse)
}

do {
let decoder = JSONDecoder()
let decodedData = try decoder.decode(T.self, from: data)
return decodedData
} catch {
throw error
}
}
}

extension NetworkManager {
func fetchBundesligaStandings(_ league: String) async throws -> [BundesligaModel] {
return try await fetchData(from: "https://api.openligadb.de/getbltable/bl1/2023")
}
// Other leagues here
}


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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • SwiftUI ViewModel не деиницируется и вызывает утечку памяти
    Anonymous » » в форуме IOS
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Вызывает ли сохранение ссылки на LazyListState в ViewModel утечку памяти?
    Гость » » в форуме Android
    0 Ответы
    43 Просмотры
    Последнее сообщение Гость
  • Pyasn decoder.decode вызывает утечку памяти, поскольку статистика докера показывает постоянный рост памяти (pysnmp=4.4.1
    Anonymous » » в форуме Python
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Привязка к списку вызывает утечку памяти
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Мое межстраничное объявление вызывает утечку памяти?
    Anonymous » » в форуме Android
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

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