seong_hye, the developer

Swift) 배열 데이터 나누고 리플래시로 받아오기 본문

IOS/SwiftUI

Swift) 배열 데이터 나누고 리플래시로 받아오기

seong_hye 2022. 11. 16.

📘배열 나누기

 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만 들고 있다 나중에 로딩하는 게 좋음) 


 

Comments