스냅샷이라는 용어를 잘 몰라 찾아보다가 여기까지 흘러 들어와 버림.,,
이는 하나의 쪼갤 수 없는 작업단위이다.
예를 들어, A 계좌에서 B 계좌로 돈을 입금한다고 할 때, 해당 A,B 계좌의 총합은 같아야하고, 이 작업이 중간에 다른 작업과 겹치거나 하면 오류가 일어날 가능성도 존재한다. 따라서 이 작업을 하나의 단위로 묶고, 다른 스레드에서는 접근을 못하게 막는다.
요약하자면, 하나의 작업 이라고 보면 된다. 쪼갤수도 없고 중간에 개입도 x
정확하지는 않을 수 있슴니다... 그리고 트랜잭션이 블록단위로 묶인게 블록체인 이라는 것도 이번에 처음 알았다 싱기
코드로 표현할 대상(또는 목표)을 몇 줄의 문장으로 표현 해보기
예를 들어, "소비내역중 카페 소비내역을 뽑아내고 소비한 총 금액을 찾아야 겠어"라는 문장일 때
먼저 결론은 enum
이다. 구조체가 아닌 이유로는 구조체 내부에 static func
만 있는 경우, 자동으로 init
함수가 구현되고 자동완성 리스트 상단에 노출된다. 이는 사용하지 않는 대상이 노출되니 번거로움이 늘어난다는 의미이다.
반면 enum
은 static func
을 선언할 수 있으면서도, init
이 없기에, 의도한 static
함수들만 자동완성 리스트에 노출되고, 추가적인 동작없이 바로 함수를 이용할 수 있다.
이를 이해하기에 앞서, 알아두면 좋을것들에 대해 먼저 살펴보겠습니다.
탈출 클로저가 가장 많이 활용되는 곳은 네트워클를 통해 데이터를 받는 경우입니다. 이때 주로 비동기적으로 작성을 하는데 이는 네트워크에서 데이터를 받아오는 동안 일어날 수 있는 Freezing
을 방지하기 위해서입니다.
전역범위, 지역범위를 생각하면 됩니다. 지역변수가 Scope
를 무시하고, 클로저에서 계속 참조되는 것처럼 보이는 경우가 있습니다. 아래 Capturing Values
참고
클로저는 주변에 있는 변수를 참조할 수 있으며, original scope
를 무시한다.
캡처한 변수가 공유되는 경우로는 클래스의 예시가 있다.
class ClosureTest {
var runningTotal = 0
func add(amount: Int) -> () -> Int {
return {
self.runningTotal += amount
return self.runningTotal
}
}
}
클래스 하나의 인스턴스에서 함수로 각각 따로 실행해도 값은 공유가 된다. 이유로는 참조타입인 클래스의 변수를 캡처를 헀기 때문이다.
이제 탈출 클로저에 대해서 알아보겠습니다.
"인자로 전달받은 함수 중 함수의 리턴이후에 실행할 수 있는 함수가 탈출 클로저이다. 간단히, 함수의 리턴 이후 실행할 수 있는 함수"
바깥의 변수에 의해서 클로저가 저장되는 경우에 클로저는 탈출할 수 있다. 대표적으로, 비동기 작업을 하는 경우, completion handler
로 탈출 클로저를 사용하는 경우가 있다.
작업이 시작되면 함수가 리턴되지만, 클로저는 작업이 끝날때까지 호출 x 그리고 이 클로저를 나중에 호출하기 위해서 escape
가 필요하다.
탈출의 의미는, 이제 접근이 불가한 범위에서 탈출을 해서 작업이 끝나면 실행을 하게끔 만들어 준다. 라고 이해를 하면 되지 싶다.
func testEscaping(_ esClosure: @escaping (Int) -> Void) {
let urlRequest = URLRequest(url: URL(string: "hello world")!)
var testCount = 3
session.dataTask(with: urlRequest) { data, response, error in
print("world")
esClosure(testCount)
}.resume()
print("hello")
}
위의 예제에서 비동기 함수인 dataTask
의 컴플리션 핸들러에서 탈출 클로저를 사용하는 것을 확인할 수 있습니다. 위 함수를 실행하면 hello
가 로그에 찍히고 내부 스코프에는 접근이 불가하지만, 비동기 작업인 dataTask
가 끝나고 completion handler
가 실행되면 내부 로직들이 실행 되는 것을 볼 수 있습니다.
참조
https://onemoonstudio.tistory.com/13
http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98