반응형
SwiftUI에서 Button을 클릭했을때 HTTP 통신으로 결과를 가져오는 검색을 많이 이용합니다. 그런데 통신 시 사용하는
URLSession을 사용하면 비동기적으로 동작합니다. 그래서 버튼 내 검색을하는 함수를 만들어서 정상적으로 동작 시에 true를 가져오고 실패 시 false를 가져오는 함수를 만들면 잘못된 결과 값을 받게 된다.
// async
// 버튼
Button(action: {
let bResult = asyncTest(url: URL(string: "https://www.google.com")!)
print(bResult)
}){Text("접속 코드 확인")}
.buttonStyle(.borderedProminent)
func asyncTest(url: URL) -> Bool {
var bResult = false; // 1
let urlRequest = URLRequest(url: url)
let dataTask = URLSession.shared.dataTask(with: urlRequest) { []
(data, response, error) in
if error != nil {
return
}
guard let response = response as? HTTPURLResponse else { return }
if response.statusCode == 200 {
guard let data = data else { return }
bResult = true // 3
}
}
dataTask.resume()
return bResult // 2
}
위 코드를 보면 asyncTest 함수에서 1, 2, 3번 순서로 실행되게 된다. 그래서 리턴하는 값은 항상 false가 된다.
그래서 HTTP 통신 이후 결과를 전달하고 싶을때는 await를 사용하여 순차적으로 동작하게 만들 수 있다.
// sync
// 버튼
Button(action: {
Task {
let bResult = try await syncTest(url: URL(string: "https://www.google.com")!)
print(bResult)
}
}){Text("접속 코드 확인")}
.buttonStyle(.borderedProminent)
func syncTest(url: URL) async throws -> Bool {
var bResult = false; // 1
let (data, response) = try await URLSession.shared.data(from: url)
let httpResponse = response as? HTTPURLResponse
if httpResponse?.statusCode == 200 {
_ = data
bResult = true // 2
}
return bResult // 3
}
위 코드는 await를 이용하여 순차적으로 실행되게 만들었습니다. 그래서 1, 2, 3번 순으로 실행이 되어 HTTP 통신이 정상적일때 2번에 도착하여 bReult를 true로 만듭니다. 그래서 리턴 값이 true가 됩니다.
반응형
'프로그램 개발해서 돈벌기 > iOS' 카테고리의 다른 글
swift에서 시간 차이(30분) 계산해서 print로 보기 (0) | 2023.02.22 |
---|---|
Apple TV 4K 기기 및 시뮬레이터에서 앱 삭제 방법 (0) | 2022.11.29 |
[SwiftUI] TabView 샘플 코드로 알아 보기 (0) | 2022.11.01 |
[SwiftUI] Http 통신을 MVVM 패턴 예제로 이해하기 (0) | 2022.10.31 |
[SwiftUI] MVVM 패턴을 샘플 코드로 간단히 이해하기 (0) | 2022.10.31 |
댓글