해결된 질문
작성
·
99
0
안녕하세요.
버튼 AddListener 사용할 때 질문이 있습니다.
loginButton.onClick.AddListener(async () => await Login());
이렇게 사용하셨는데요.
AddListener 함수가 콜백을 await 해주지 않기때문에, 이렇게 사용하는게 낫지 않나요?
loginButton.onClick.AddListener(Login);
private async void Login()
{
try
{
await AuthenticationService.Instance.SignInAnonymouslyAsync();
string playerName = await AuthenticationService.Instance.GetPlayerNameAsync();
playerNameIF.text = playerName.Split('#')[0];
}
catch (Exception e)
{
print(e.Message);
}
}
답변 2
1
안녕하세요.
Login 메소드는 async void이기에 AddListener에서 기본적으로 반환값(Task)를 처리하지
않기 때문에 바로 Login 메소드를 전달하는 방식이 간결한 표현 방식이 맞습니다.
불필요한 래핑을 사용했네요. ㅠㅠ
간단한 로직은 별도의 async 메소드를 만들지 않고 바로 처리하는 로직과
병행해서 설명하다 보니 습관적으로 사용했던것 같습니다.
혼란을 드려 송구합니다.
앞으로 강의에서 제시해드리는 코드에 대한 세밀히 검토하도록 하겠습니다.
의견주셔서 감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. ac3c2fe4님.
버튼의 이벤트 리스너에 비동기 메서드를 연결할 때의 문제에 대한 좋은 질문을 주셨습니다. Unity의 Button.onClick.AddListener
는 기본적으로 콜백의 비동기 동작을 await
하지 않고, 동기적으로 호출하기 때문에 특정한 흐름 제어가 필요할 수 있습니다.
비동기 메서드를 async
및 await
키워드를 사용하여 호출하면, 코드의 실행 흐름이 자연스럽게 중단되지 않고 대기할 수 있습니다. async void
메서드는 예외를 처리하고 로그를 기록하는 데 유용하여, 이러한 방식을 자주 사용합니다.
async
키워드를 포함한 람다 표현식을 사용하는 경우:
loginButton.onClick.AddListener(async () => await Login());
이 방법은 바로 비동기 함수 내에서 결과를 기다리는 방식으로, 사용 용이성에 중점을 둡니다.
비동기 메서드를 직접 연결하는 방법:
”`csharp
loginButton.onClick.AddListener(Login);
private async void Login()
{
try
{
await AuthenticationService.Instance.SignInAnonymouslyAsync();
string playerName = await AuthenticationService.Instance.GetPlayerNameAsync();
playerNameIF.text = playerName.Split(‘#’)[0];
}
catch (Exception e)
{
print(e.Message);
}
}
“`
이 방법은 좀 더 깔끔해 보일 수도 있고, 함수 내에서 예외 처리를 직접 핸들링할 수 있는 점에서 장점이 있습니다.
각 방식은 장단점이 있으며, 주어진 코드나 시나리오에 따라 적절하게 선택하면 됩니다.
이 주제에 관련된 내용을 더 깊이 이해하고 싶으시다면 다음 링크를 참고하시면 도움이 될 수 있습니다:
- 유니티에서의 비동기 프로그래밍
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.