func getData() {
DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: { [weak self] in
// LOGN DATA DOWNLOADING
self?.data = "NEW DATA"
})
}
weak self
를 선언, 현재 담당 self
가 nil
이 될 수도 있기 때문에 이후 참조 카운팅을 할 때 자동으로 사라짐
import SwiftUI
struct WeakSelfBootCamp: View {
@AppStorage("count") var count: Int?
init() {
count = 0
}
var body: some View {
NavigationView {
NavigationLink("Navigate", destination: WeakSelfSecondScreen())
.navigationTitle("Screen 1")
}
.overlay(
Text("\(count ?? 0)")
.font(.largeTitle)
.padding()
.background(Color.green.cornerRadius(10))
, alignment: .topTrailing
)
}
}
struct WeakSelfSecondScreen: View {
@StateObject private var viewModel = WeakSelfSecondScreenViewModel()
var body: some View {
Text("Second View")
.font(.largeTitle)
.foregroundColor(.red)
if let data = viewModel.data {
Text(data)
}
}
}
class WeakSelfSecondScreenViewModel: ObservableObject {
@Published var data: String? = nil
init() {
print("INIT")
let curCount = UserDefaults.standard.integer(forKey: "count")
UserDefaults.standard.set(curCount + 1, forKey: "count")
getData()
}
func getData() {
DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: { [weak self] in
// LOGN DATA DOWNLOADING
self?.data = "NEW DATA"
})
}
deinit {
print("DEINIT")
let curCount = UserDefaults.standard.integer(forKey: "count")
UserDefaults.standard.set(curCount - 1, forKey: "count")
}
}
WeakSelfSecondScreen
으로 네비게이션 이동할 때마다 WeakSelfSecondScreenViewModel
을 초기화 생성, 데이터를 패치하는 이니셜라이저 구현getData
) 메소드를 호출하기 때문에 어느 정도의 시간이 걸리지 알 수 없음self
가 nil
이 될 경우 참조 카운팅을 하지 않겠다는 표시를 통해 해결강한 참조
약한 참조