[swift] Reachability를 사용해 인터넷 연결 상태가 변경되는 경우 UI 업데이트하기

iOS 앱을 개발할 때, 사용자의 인터넷 연결 상태를 확인하고 해당 상태에 따라 UI를 업데이트해야 할 때가 있습니다. 이를 위해 Reachability 라이브러리를 사용할 수 있습니다. Reachability는 iOS에서 인터넷 연결 상태를 모니터링하고 변경 사항에 대한 알림을 받을 수 있는 도구입니다.

이번 블로그 포스트에서는 Swift와 Reachability 라이브러리를 사용하여 인터넷 연결 상태가 변경되는 경우 UI를 업데이트하는 방법을 알아보겠습니다.

Reachability 라이브러리 가져오기

먼저, Reachability 라이브러리를 프로젝트에 추가해야 합니다. Reachability 라이브러리는 CocoaPods를 통해 간편하게 설치할 수 있습니다. 프로젝트의 Podfile에 다음과 같은 내용을 추가하고, 터미널에서 pod install 명령어를 실행하세요.

target 'YourProjectName' do
  # 기존 설정
  pod 'ReachabilitySwift', '~> 5.1.0'
end

Reachability 클래스를 사용하여 인터넷 연결 상태 확인하기

Reachability 라이브러리를 추가한 후, 인터넷 연결 상태를 확인하기 위해 Reachability 클래스를 사용해야 합니다. 아래와 같이 Reachability 클래스를 생성하고, 현재의 연결 상태를 확인할 수 있습니다.

import Foundation
import ReachabilitySwift

class NetworkManager {
    static let shared = NetworkManager()
    
    var reachability: Reachability?
    
    private init() {
        do {
            reachability = try Reachability()
        } catch {
            print("Unable to create Reachability")
        }
    }
    
    func startMonitoring() {
        do {
            try reachability?.startNotifier()
        } catch {
            print("Unable to start Reachability notifier")
        }
    }
    
    func stopMonitoring() {
        reachability?.stopNotifier()
    }
    
    func isNetworkAvailable() -> Bool {
        return reachability?.currentReachabilityStatus != .notReachable
    }
}

위의 코드에서는 싱글톤 패턴을 사용하여 NetworkManager 클래스를 구현했습니다. Reachability 인스턴스를 생성하고, startMonitoring() 메서드를 호출하여 인터넷 연결 상태의 변경을 모니터링합니다. stopMonitoring() 메서드는 더이상 인터넷 연결 상태 변경을 모니터링하지 않고자 할 때 호출할 수 있습니다. isNetworkAvailable() 메서드는 현재의 인터넷 연결 상태를 확인합니다.

NotificationCenter를 사용하여 UI 업데이트하기

인터넷 연결 상태가 변경되면, 해당 변경 사항에 따라 UI를 업데이트해야 합니다. 이를 위해 NotificationCenter를 사용하여 Reachability 객체에 등록한 후, 변경 사항을 감지할 수 있습니다. 아래의 코드 예시에서는 NotificationCenter를 사용하여 인터넷 연결 상태 변경을 감지하고, 이에 따른 UI 업데이트를 수행합니다.

import UIKit
import ReachabilitySwift

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChanged), name: ReachabilityChangedNotification, object: nil)
        NetworkManager.shared.startMonitoring()
    }
    
    @objc func networkStatusChanged() {
        if NetworkManager.shared.isNetworkAvailable() {
            // 인터넷 연결됨
            // UI 업데이트 로직 추가
        } else {
            // 인터넷 연결되지 않음
            // UI 업데이트 로직 추가
        }
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
        NetworkManager.shared.stopMonitoring()
    }
}

위의 예시 코드에서는 ViewController가 로드될 때 NotificationCenter를 사용하여 ReachabilityChangedNotification을 구독하고, networkStatusChanged() 메서드를 호출합니다. networkStatusChanged() 메서드에서는 현재의 인터넷 연결 상태를 확인하고, 상태에 따라 UI를 업데이트합니다. ViewController가 해제될 때에는 NotificationCenter 구독을 취소하고, NetworkManager의 인터넷 연결 상태 모니터링을 중단합니다.

이제 Reachability를 사용하여 인터넷 연결 상태가 변경되는 경우 UI를 업데이트하는 방법을 알게 되었습니다. Reachability를 통해 사용자의 인터넷 연결 상태를 감지하고, 이를 활용하여 앱의 UI를 적절하게 업데이트하는 것은 사용자 경험을 개선하기 위해 꼭 필요한 작업입니다.


참고자료