[iOS] defer: 후처리

z-wook·2024년 2월 5일
post-thumbnail

defer란?

defer코드 블록을 나중에 실행되도록 지연시키는 역할defer 블록 내의 코드는 실행을 연기하고, 해당 블록이 속한 스코프를 빠져나갈 때 실행됩니다.

즉, defer 블록은 함수가 반환되기 전에 실행됩니다.

아래의 예제를 통해 defer의 실행 순서에 대해 알아보겠습니다.

func deferTest() {
    print("~~~~~ Start ~~~~~")
    
    defer {
        print("defer #1")
    }
    
    print("<===== End =====>")
}

이 코드에서 defer 블록 안의 내용은 함수가 종료(반환) 되기 전에 실행되는 것을 볼 수 있습니다.


defer 특징

  1. defer는 작성된 위치와 상관없이 함수 종료 직전에 실행됩니다.
func deferTest() {
    defer {
        print("defer #1")
    }
    
    print("~~~~~ Start ~~~~~")
    print("<===== End =====>")
}


  1. defer를 읽기 전에 함수가 종료(반환) 되면 defer가 실행되지 않습니다.
func deferTest() {
    print("~~~~~ Start ~~~~~")
    
    return
    defer {
        print("defer #1")
    }
    
    print("<===== End =====>")
}


defer를 사용하는 이유?

defer는 주로 파일 핸들이나 네트워크 연결과 같은 리소스를 정리하는 데 사용되며, 코드의 가독성을 높이고 코드의 마지막 부분에서 필요한 작업을 처리하는 데 사용됩니다.

  • 이전 코드
func loadData() {
	Task {
		do {
			process(action: .loading(true))
			let response = try await NetworkManager.shared.getProductDetailData()
			process(action: .getDataSuccess(response))
			process(action: .loading(false))
		} catch {
			process(action: .getDataFailure(error))
			process(action: .loading(false))
		}
	}
}
  • 개선 코드
func loadData() {
	Task {
		defer {
			process(action: .loading(false))
		}
		do {
			process(action: .loading(true))
			let response = try await NetworkManager.shared.getProductDetailData()
			process(action: .getDataSuccess(response))
		} catch {
			process(action: .getDataFailure(error))
		}
	}
}
profile
🍎 iOS Developer

0개의 댓글