[swift] Reachability를 사용해 인터넷 연결 속도에 따라 이미지 로딩 방식 변경하기

앱에서 이미지를 로딩할 때 인터넷 연결 속도에 따라 이미지 로딩 방식을 변경하는 것은 사용자 경험을 향상시키는 좋은 방법입니다. 이를 위해 iOS 앱에서는 Reachability를 사용하여 현재 인터넷 연결 상태를 감지할 수 있습니다. 이제 Swift를 사용하여 Reachability를 구현하고 인터넷 연결 속도에 따라 이미지 로딩 방식을 변경하는 방법을 알아보겠습니다.

Reachability 클래스 구현하기

먼저 Reachability 클래스를 만들어 인터넷 연결 상태를 감지하는 기능을 구현해야 합니다. Reachability 클래스는 Apple에서 제공하는 Reachability 예제 코드를 이용하겠습니다.

import SystemConfiguration

public class Reachability {
    
    class func isConnectedToNetwork() -> Bool {
        
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
        
        guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        }) else {
            return false
        }
        
        var flags : SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags){
            return false
        }
        
        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)
        
        return (isReachable && !needsConnection)
    }
}

위의 코드는 현재 기기가 인터넷에 연결되어 있는지 확인하기 위해 Reachability 클래스를 구현한 것입니다.

이미지 로딩 방식 변경하기

이제 Reachability를 사용하여 인터넷 연결 상태에 따라 이미지 로딩 방식을 변경하는 예제를 살펴보겠습니다. 예를 들어, 인터넷 속도가 느린 경우에는 낮은 품질의 이미지를 로딩하고, 빠른 경우에는 고화질의 이미지를 로딩하도록 할 것입니다.

import UIKit

class ImageLoader {
    
    func loadImage(url: String) {
        
        var imageUrl = url
        
        if !Reachability.isConnectedToNetwork() {
            // 인터넷에 연결되어 있지 않은 경우 품질이 낮은 이미지 url로 변경
            imageUrl = "https://example.com/low_quality_image.jpg"
        }
        
        DispatchQueue.global().async {
            if let data = try? Data(contentsOf: URL(string: imageUrl)!) {
                DispatchQueue.main.async {
                    let image = UIImage(data: data)
                    // 이미지 로딩이 완료되면 UI에 반영
                    imageView.image = image
                }
            }
        }
    }
}

위의 예제 코드는 loadImage 메소드를 통해 이미지를 로딩하는 일련의 과정을 나타낸 것입니다. Reachability 클래스를 사용하여 인터넷 연결 상태를 체크한 후, 연결 상태에 따라 이미지 url을 변경하여 해당 이미지를 로딩합니다. 로딩이 완료되면 해당 이미지를 UI에 반영합니다.

이제 앱에서 이미지를 로딩할 때 Reachability를 이용하여 인터넷 연결 속도에 따라 이미지 로딩 방식을 변경할 수 있게 되었습니다.

결론

Reachability를 사용하여 인터넷 연결 상태를 감지하고, 연결 상태에 따라 이미지 로딩 방식을 변경하는 방법을 알아보았습니다. 이를 통해 사용자들은 인터넷 연결 속도에 구애받지 않고 항상 최적의 이미지 품질을 경험할 수 있게 됩니다.

참고 자료: