일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MVVM
- swift 프로그래머스
- swift 2xn 타일링 백준
- ac 투포인터
- 백준 2xn 타일링
- swift 백준 9095
- swift 2xn 타일링 풀이
- 연속된 부분 수열의 합 swift
- swift ac 문제풀이
- swift ac 풀이
- swift gRPC
- swift 9095 풀이
- 백준 2xn 타일링 풀이
- swift 알고리즘
- iOS Charts
- swift ac
- ac 구현 풀이
- swift 연속된 부분 수열의 합 풀이
- swift 연속된 부분 수열의 합
- swift
- swift dfs
- ios
- rxswift
- 123 더하기 풀이
- ac swift 풀이
- swift codility
- swift algorithm
- 연속된 부분 수열의 합 투포인터
- 1 2 3 더하기 풀이
- swift 2xn 타일링
- Today
- Total
boraBong
[iOS] 네트워크 기반에서 URL을 요청할 때 - Data(contentsOf: url) 메서드 대신 dataTask(with:completionHandler:) 메서드를 사용하자 본문
[iOS] 네트워크 기반에서 URL을 요청할 때 - Data(contentsOf: url) 메서드 대신 dataTask(with:completionHandler:) 메서드를 사용하자
보라봉_ 2022. 11. 14. 21:15네트워크 기반에서 URL을 요청할 때 Data(contentsOf: url) 메서드보다 dataTask(with:completionHandler:) 메서드를 권장하는데요, 그 이유에 대해서 알아봅시다!
🍎 Data(contentsOf: url)
→ 동기적으로 데이터를 다운받는 방법
init?(contentsOf url: URL)
Data(contentsOf: url) 메서드를 사용하여 data://URL을 NSData 개체로 변환합니다.
또한 짧은 파일을 동기적으로 읽는 데 사용할 수도 있습니다.
⚠️ 네트워크 기반에서 URL을 요청할 때Data(contentsOf: url) 메서드를 권장하지 않는 이유
- Data(contentsOf: url) 동기식 이니셜라이저를 사용하여 네트워크 기반 URL을 요청하지 마십시오.
네트워크 기반 URL의 경우 이 방법은 느린 네트워크에서 수십 초 동안 현재 스레드를 차단하여 사용자 경험을 저하시킬 수 있으며 iOS에서는 앱이 종료될 수 있습니다. - Data(contentsOf: url) 메서드는 메인 스레드에서 동기적으로 수행됩니다. 따라서 이미지를 다운로드 하고 뷰에 로드하는데 많은 시간이 소요될 경우 앱의 UI가 마비될 수 있는 위험이 있어 주의해야 하는 것입니다!
💡 그렇다면, GCD의 global 스레드로 감싸준다면 해결될 수 있지 않을까?
- 메인 스레드가 마비되는 문제는 해결할 수 있겠지만, global 스레드에서 작업이 수행된다 하더라도 작업 처리 방식이 비동기 방식이 아닌 “동기 방식”임에 주의해야 합니다.
- global 스레드에서 수행된다 하더라도 특정 대기열 큐 하나는 작업이 끝나기 전까지 제한되기 때문입니다.
Data(contentsOf: url) 메서드는 동기적인 방식으로 URL을 다운받기 때문에 위와 같은 문제의 가능성이 있습니다.
따라서 Apple 개발자 문서에서는 같은 동작을 수행하지만 동작을 동기적으로 제한하지 않는 URLSession의 기본 메서드인 dataTask(with:completionHandler:) 를 활용할 것을 권장합니다.
🍎 dataTask(with:completionHandler:)
→ URLSession 클래스의 기본 메서드
func dataTask(
with url: URL,
completionHandler: @escaping @Sendable (Data?, URLResponse?, Error?) -> Void
) -> URLSessionDataTask
completionHandelr를 통해 URL 다운로드 작업 수행 완료 후의 작업 처리가 가능하며,
iOS의 네트워크 통신 기본 클래스인 URLSession의 기본 메서드이므로 에러 발생시 에러 처리가 용이하다는 장점이 있습니다.
<참고 글>
https://developer.apple.com/documentation/foundation/nsdata/1413892-init
https://developer.apple.com/documentation/foundation/urlsession/1410330-datatask
https://inuplace.tistory.com/1230