Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- Switch
- 화면전환
- SWIFT
- list
- struct
- ScrollView
- segue
- calendar
- viewlifecycle
- SWIFTUI
- PushNotification
- apns
- NotificationCenter
- class
- 회고
- error
- self
- http
- Git
- Observer
- protocol
- IOS
- 고차함수
- mvvm
- uikit
- singleton
- Refresh
- array
- 글또
- escaping
Archives
- Today
- Total
seong_hye, the developer
Swift) 배열 데이터 나누고 리플래시로 받아오기 본문
📘배열 나누기
SwiftUI에서 배열 데이터가 너무 많아 리플래시를 활용해
데이터를 나누고 추가로 받아오는 방식을 정리해보려 함
🔹배열 나누는 코드
@State private var fullData = Arry(1...1000) // 전체 데이터
@State private var visibleData : [Int] = [] // 화면에 보일 데이터
@State private var batchSize = 20
func divideArray() {
let nextEnd = min(visibleData.count + batchSize, fullData.count)
let nextItems = fullData[visibleData.count ..< nextEnd]
visibleData.append(cotentOf: newItems)
}
- 전체 데이터 사이즈를 통해 20개씩 받아올 수 있도록 코드를 작성
- min을 활용해 배열이 index out of range가 나지 않도록 안전처리해 줌
🔹스크롤이 리스트 맨 끝에 닿았을 때 자동 로딩하는 코드
ForEach(visibleData.indices, id: \.self) { index in
Text("item \(visibleData[index])")
.onAppear {
if index == visibleData.count - 1 {
divideArray()
}
}
}
- 마지막 배열과 데이터 크기를 비교해서 마지막이면 받아올 수 있도록 해줌
🔹메모리 관점
SwiftUI에서 배열 데이터를 나눠서 점진적으로 받아오는 방식 = 페이징 or incremental loading
항목 | 전체 배열 한번에 로딩 | 점진적 로딩 |
초기 메모리 사용량 | 높음 (전체 보유) | 낮음 (부분만 유지) |
스크롤 성능 | 느려질 수 있음 (특히 list) | 안정적 유지 |
앱 크래시 위험 | 증가 (특히 이미지 도는 무거운 객체일 경우) | 감소 |
재사용 / 해제 | 잘 안 됨 (한 번에 다 붙잡음) | 필요할 때만 메모리 사용 |
✅ 왜 점진적 로딩이 메모리상 유리할까?
1. 뷰 사용량이 제한됨
- SwiftUI의 List, LazyVStack은 일부만 메모리에 올려도 되지만
배열이 너무 크면 diffing이니나 state tracking 자체가 무거워짐
2. 배열 자체의 메모리 사용량 감소
- visibleData 배열만 메모리에 유지하면 됨
- 이미지, 비디오, PDF 등 메모리 많은 데이터 처리 시 특히 중요
(Data, URL, Thubnail만 들고 있다 나중에 로딩하는 게 좋음)
'IOS > SwiftUI' 카테고리의 다른 글
SwiftUI) Side Menu view에 대해 정리하기 (0) | 2022.12.06 |
---|---|
Swift) Swift 스타일에 대해 알아보기 (0) | 2022.11.29 |
Swift) DarkMode 활용하기(ColorScheme) (0) | 2022.11.03 |
SwiftUI) Toast 생성해보기(normal, enum에 따른 toast) (0) | 2022.10.29 |
SwiftUI) View Life Cycle (0) | 2022.10.27 |
Comments