본문 바로가기
프로그램 개발해서 돈벌기/iOS

Synchronous operation using await when clicking a Button in SwiftUI and receiving the result through HTTP communication.

by ubmuhan 2022. 11. 24.
반응형

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가 됩니다.

반응형

댓글