Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Tuist
- TCA
- 모바일
- concurrency
- ObjC
- Navigation
- Git
- 정규표현식
- github
- test
- combine
- tuist #xcodecloud #ios #ci/cd #swiftlint #firebase
- composablearchitecture
- 개발
- Alamofire
- network
- ios18
- SWIFT
- swiftdata
- IOS
- SWIFTUI
- xcodecloud
- UI
- uikit
- Firebase
- regex
- iOS 개발자
- iOS 13.0+
- navigationsplitview
- xcode
Archives
- Today
- Total
iOS 개발 기록
[Swift] CompletionHandler 본문
728x90
CompletionHandler
📄 목차
completionHandler
func login(loginData: Login, completionHandler: @escaping () -> Void) {
guard let webview = self.webview else { return }
webview.evalFlexFunc("login", sendData: loginData) { data in
log.debug(" PMS LOGIN! ")
completionHandler() // ❗️실수하기 쉬운 포인트
}
}
// 사용
login(loginData: signInInfo) {
print("로그인 성공")
}
@escaping
을 통해 콜백 기반 comopletionHandler를 실행.- 단점 :
- 깜빡하고 completionHandler를 실행하지 않을 경우 컴파일러가 에러를 안뱉음.
- completionHandler를 많이 오출해야 하는 경우 무수한 콜백 지옥
- self를 사용할 경우 강한 참조 사이클에 주의해야 한다.
- 코드가 안예쁘대.
Combine
func login(loginData: Login) -> AnyPublisher <Void, Never> {
return Future() { promise in
guard let webview = self.webview else { return }
webview.evalFlexFunc("login", sendData: loginData) { data in
log.debug(" PMS LOGIN! ")
}
promise(.success(()))
}.eraseToAnyPublisher()
}
}
// 사용
login(loginData: signInInfo)
.sink(receiveValue: { _ in
print("로그인 완료")
})
.store(in: &cancellable)
- completionHandler는 combine의
Future
를 통해 대체 가능. Future
를 통해 발행된 데이터는sink
와 같은 subscriber를 통해 전달 받을 수 있다.Future
: 로직을 수행한 후 비동기로 성공과 실패를 전달하는 publisher.
성공할 경우promise
를 통해 element를 전달한다.- 단점 : 아래는 단점이라기보단 개인적인 느낌
- Combine를 import 해야함.
- 위와 같이 다른 작업 없이 완료한 내용만 알리는 거라면 굳이 combine을 사용해야하나?
SwiftConcurrency
func login(loginData: Login) async {
guard let webview = self.webview else { return }
await webview.evalFlexFunc("login", sendData: loginData) { data in
log.debug(" PMS LOGIN! ")
}
}
// 사용
Task{
await self.bridgeAction?.login(loginData: signInInfo)
}
- 참고
'iOS > 비동기처리' 카테고리의 다른 글
[Concurrency] AsyncStream (0) | 2023.04.07 |
---|---|
[Concurrency]Continuation (0) | 2023.04.04 |
[Concurrency] async / await (0) | 2023.02.06 |