์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋„คํŠธ์›Œํฌ] URLSession - .resum()๊ณผ task.resum()์˜ ์ฐจ์ด?

๐ŸŽ iOS/Network

by AHN.Jihyeon 2024. 7. 29. 00:28

๋ณธ๋ฌธ

// ์‚ฌ์šฉ์ž์˜ ์ฆ๊ฒจ์ฐพ๊ธฐ ์˜ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค
class FavoriteManager {
    
    static let shared = FavoriteManager()
    private init() {}
    
    var persistentContainer: NSPersistentContainer {
        return (UIApplication.shared.delegate as! AppDelegate).persistentContainer
    }
    
    
    // MARK: - Core Data Saving support
    func saveContext() {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
                print("User saved successfully")
            } catch {
                let nserror = error as NSError
                print("Failed to save user: \(error.localizedDescription)")
            }
        }
    }
}
  • saveContext ๋ฉ”์†Œ๋“œ: ์ด ๋ฉ”์†Œ๋“œ๋Š” ํ˜„์žฌ์˜ ๊ด€๋ฆฌ ๊ฐ์ฒด ์ปจํ…์ŠคํŠธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์ด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • persistentContainer.viewContext: ํ˜„์žฌ์˜ ๊ด€๋ฆฌ ๊ฐ์ฒด ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • context.hasChanges: ์ปจํ…์ŠคํŠธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • context.save(): ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์˜๊ตฌ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค.
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: ์ €์žฅ ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ catch ๋ธ”๋ก์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

func fetchMovieBackdropImage(movieId: Int, completion: @escaping (String?) -> Void) {
    let urlString = "\(baseUrl)/movie/\(movieId)?api_key=\(apiKey)&language=ko-KR"
    fetchMovieDetail(with: urlString) { movieDetail in
        completion(movieDetail?.backdropPath)
    }
}


// ๊ณตํ†ตํ™”๋œ fetchMovieDetail ๋ฉ”์†Œ๋“œ
private func fetchMovieDetail(with urlString: String, completion: @escaping (MovieDetail?) -> Void) {
    guard let url = URL(string: urlString) else {
        print("Invalid URL")
        completion(nil)
        return
    }

    URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            print("Error: \(error.localizedDescription)")
            completion(nil)
            return
        }

        guard let data = data else {
            print("No data returned")
            completion(nil)
            return
        }

        do {
            let decoder = JSONDecoder()
            let movieDetail = try decoder.decode(MovieDetail.self, from: data)
            completion(movieDetail)
        } catch let jsonError {
            print("JSON error: \(jsonError.localizedDescription)")
            print(String(data: data, encoding: .utf8) ?? "No readable data")
            completion(nil)
        }
    }.resume()
}

 

๊ณตํ†ต ๋ฉ”์†Œ๋“œ fetchMovieDetail๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํด๋กœ์ €๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ๊ฒฐ๊ณผ๋ฅผ fetchMovieBackdropImage ๋ฉ”์†Œ๋“œ์—์„œ ๋ฐ›์•„์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(backdropPath)๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋‹ค์‹œ ํด๋กœ์ €๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

fetchMovieBackdropImage ๋ฉ”์†Œ๋“œ์—์„œ๋Š” URL ์ƒ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ถ”์ถœ๋งŒ ๋‹ด๋‹นํ•˜๊ณ ,

์‹ค์ œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ JSON ๋””์ฝ”๋”ฉ์€ ๊ณตํ†ตํ™”๋œ fetchMovieDetail ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Š” ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋ฉฐ, ๊ฐ ๋ฉ”์†Œ๋“œ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 


๋‘ ์ฝ”๋“œ์˜ ์ฐจ์ด์  

 

1. ๋””์ฝ”๋”ฉํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…:

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ๋Š” MovieDetail ํƒ€์ž…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ๋Š” MovieResponse ํƒ€์ž…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•œ๋‹ค.

 

2. completion ํ•ธ๋“ค๋Ÿฌ์˜ ์ธ์ž:

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์˜ completion ํ•ธ๋“ค๋Ÿฌ๋Š” MovieDetail? ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ์˜ completion ํ•ธ๋“ค๋Ÿฌ๋Š” [Movie]? ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค. MovieResponse๋Š” results๋ผ๋Š” ๋ฐฐ์—ด ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

3. ์‘๋‹ต ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ:

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์˜ํ™”์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ด์€ ๋‹จ์ผ ๊ฐ์ฒด MovieDetail์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์˜ํ™” ๋ชฉ๋ก์„ ๋‹ด์€ MovieResponse ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ [Movie] ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์–ด๋–ค ์ƒํ™ฉ์— ์‚ฌ์šฉํ• ๊นŒ?

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ํŠน์ • ์˜ํ™”์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ํ™”์˜ ์ œ๋ชฉ, ์ค„๊ฑฐ๋ฆฌ, ๊ฐ๋…, ์ถœ์—ฐ์ง„ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” MovieDetail ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ์˜ํ™”์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๊ธฐ ์˜ํ™” ๋ชฉ๋ก์ด๋‚˜ ํŠน์ • ์žฅ๋ฅด์˜ ์˜ํ™” ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€์•ผ ํ•  ๋•Œ MovieResponse ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [Movie] ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ