Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use async/await with URLSession #33

Open
kimscastle opened this issue Aug 3, 2023 · 0 comments
Open

Use async/await with URLSession #33

kimscastle opened this issue Aug 3, 2023 · 0 comments
Assignees
Labels
Swift 주제 WWDC22 WWDC 22년영상 의성

Comments

@kimscastle
Copy link
Contributor

kimscastle commented Aug 3, 2023

Completion Handler를 활용한 URLSession의 문제점

코드의 가독성 문제

  1. 아래의 스크린샷 처럼 코드의 흐름이 위아래로 왔다갔다 하기때문에 한눈에 데이터의 흐름을 읽기가 쉽지 않다
스크린샷 2023-08-03 오후 5 30 18
  1. 스레드 관점에서도 datatask와 main으로 왔다갔다해야하는 상황이기도하다. 이런상황에서 경합이발생할 가능성이 생긴다.
스크린샷 2023-08-03 오후 5 32 17
  1. 아래코드에서 UIImage가 data에서 반환되지 못한경우 에러핸들링이 누락되어 nil nil이 반환될 가능성이 존재하고 이 경우에는 에러가 발생헀을때 어떤에러가 발생했는지를 찾기 어려울 수 있다
스크린샷 2023-08-03 오후 5 34 34

Async/Await 도입

  1. 아래의 코드처럼 가독성측면에서 코드의 흐름이 아래로 정렬되어 파악하기 쉬워진다
  2. 또한 함수 자체가 동기적으로 실행되기 때문에 스레드문제를 걱정할 필요가 없어진다
  3. 에러가 발생할 가능성이 있는경우 언레핑을 통해 에러를 던질수있으므로 에러핸들링이 누적될 가능성도 낮아진다
스크린샷 2023-08-03 오후 5 30 11

Async/Await의 메서드

  1. URL을 이용해 data를 요청하는 경우 GET만 가능하다(GET중에서도 HEADER에 아무것도 없어도 되는경우)
  2. URLRequest를 이용하는 경우는 GET이외의 httpMethod를 이용해야하는 경우, GET에서 header에 데이터를 담아야하는경우
  3. Download의 경우는 메모리가 아닌 파일형식으로 저장하며 자동으로 삭제되지 않기때문에 삭제해주는 코드를 추가로 작성해줘야한다
스크린샷 2023-08-03 오후 5 40 56

URLSession.AsyncBytes

  • 이건 굉장히 신기한 기능이었는데 사실 우리가 보통 api를 호출하는 곳은 viewwillappear이고 그러다보니 실제로 user가 다른 view에갔다 오는 action이 없다면 새로고침 버튼이라던지 혹은 아래로 당겨서 새로고침같은기능을 넣어줬어야했다(그동안은) 근데 이 urlsession 메서드를 사용하면 서버쪽에서 데이터가 변할때마다 line단위의 response를 쏴주는 api를 만들어주면 우리가 해당 결과를 line단위로 받아서 자동 갱신이 가능해진다
스크린샷 2023-08-03 오후 6 00 14

URLSession Delegate

  • 이부분은 사실 제대로 이해하지는 못했지만 조금 강력한 기능인거같아서 정리를 해보면 urlsession을 사용할때 delegate 메서드를 정의해줄수있다(?)정도인거같다 예를들어서 해당 영상 예시에서 강아지사진에 좋아요를 누르면 urlsession을 통해 api호출을 시작하는데 그때 urlsession delegate를 파라미터로 만들어서 넣어주면(해당프로토콜을 채택한 함수) 해당 메서드를 사용할수있다(?)정도로 좀 러프하게 이해했다.
  • 예시에서는 유저의로그인 여부를 delegate함수로 만들어서 api를 calling할때 여부를 확인할수있다
@kimscastle kimscastle self-assigned this Aug 3, 2023
@kimscastle kimscastle added WWDC22 WWDC 22년영상 의성 Swift 주제 labels Aug 3, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Swift 주제 WWDC22 WWDC 22년영상 의성
Projects
None yet
Development

No branches or pull requests

1 participant