Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
SwiftUI/SwiftUI(Basic)

[54] AsyncImage / @unknown

by Toughie 2023. 5. 11.

⭐️AsyncImage / @unknown⭐️

AsyncImage는 SwiftUI에서 이미지를 비동기적으로 로드하는 데 사용되는 뷰이다.
이미지를 로드하는 동안 UI를 멈추지 않고 사용자 경험을 향상시킬 수 있다.(검은 화면만 보이면 유저는 어떤 상황인지 알지 못함)


*URL(Uniform Resource Locator 또는 통칭 web address, 문화어: 파일식별자, 유일자원지시기)
 
네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약

 

*캐시(cache) - 데이터나 값을 미리 저장해 놓는 임시 저장소. 데이터가 캐시에 저장되어 있다면
다음에 데이터에 접근할 때 더 빠르게 데이터를 가져올 수 있다. (캐시 삭제)

캐시는 데이터를 빠르게 가져올 수 있어서 앱 성능 향상에 도움이 된다. 네트워크 사용량도 줄일 수 있다.

하지만 일정 시간이 지나면 데이터가 유효하지 않을 수도 있음을 유의하자.

 

AsyncImage는 URL을 받아서 다운로드 및 캐싱을 처리한다.
즉 동일한 URL로 이미지를 다시 요청할 경우 이미지를 다시 다운로드 하는 대신 캐시에서 이미지를 로드한다.

 

활용 예시

//  Created by Toughie on 2023/05/11.
//

import SwiftUI

struct AsyncImagePrac: View {
    
    let url = URL(string: "https://picsum.photos/400")
    
    var body: some View {
	
        AsyncImage(url: url, content: { returnedImage in
            returnedImage
                .resizable()
                .scaledToFit()
                .frame(width: 200, height: 200)
                .cornerRadius(20)
        }, placeholder: {
            ProgressView()
        })
        .frame(width: 100, height: 100)
    }
}

이미지가 로드 되는 동안 ProgressView()를 통해 끊김 없는 UI 제공

 

 

AsyncImagePhase

//열거형으로 이루어져 있음.
 //Getting load phases
 case empty
 No image is loaded.
 
 case success(Image)
 An image succesfully loaded.
 
 case failure(Error)
 An image failed to load with an error.
struct AsyncImagePrac: View {
    
    let url = URL(string: "https://picsum.photos/400")
    
    var body: some View {
        
                AsyncImage(url: url) { phase in
                    switch phase {
                    case .empty:
                        ProgressView()
        
                    case .success(let image):
                        image
                            .resizable()
                            .scaledToFit()
                            .frame(width: 200, height: 200)
                            .cornerRadius(20)
        
                    case .failure:
                        Image(systemName: "questionmark")
                            .font(.headline)
        
                    @unknown default:
                        Image(systemName: "questionmark")
                            .font(.headline)
                    }
                }
    }
}

아무런 이미지가 로드 되지 않았을 때, 이미지 로드에 성공했을 때, 이미지 로드에 성공했을 때 좀 더 세부적으로 분기처리를 할 수 있다.

 

@unknown

Swift의 switch문에서 exhaustive 하지 않은 경우 컴파일러 경고를 피하기 위해 필요한 문법.

Swift에서 enum의 케이스가 추가될 때, 이전에 작성한 코드에서 새로운 case 처리를 누락할 수도 있다.
@unknown default:를 사용하면 새로운 case를 처리하지 않아도 컴파일 경고가 발생하지 않는다.

 

위 코드에서는 이런 경고가 나와서 추가해주었다. 아마 이후 버전에 새로운 case가 추가 되려나봄..

 

'SwiftUI > SwiftUI(Basic)' 카테고리의 다른 글

[56] TextSelection / Window, Scene  (0) 2023.05.12
[55] Background Materials  (0) 2023.05.11
[53] 온보딩뷰 만들기  (0) 2023.05.08
[52] @AppStorage / UserDefaults  (0) 2023.05.07
[51] @EnvironmentObject / 뷰 계층 구조  (0) 2023.05.07