0

동시 DispatchQueue은 코드가 즉시 반환되므로 호출 스레드를 차단하지 못한다는 것을 알게되었습니다. 대개 큰 데이터를로드하는 백그라운드 작업과 함께 사용됩니다.완성 처리기를 DispatchQueue와 함께 사용

완료 핸들러 (예 : URLSession)를 사용하면 일부 작업이 완료된 후에 핸들러 내부의 코드를 실행할 수 있습니다.

제 질문은 : 그것은 동시 디스패치 대기열과 완료 처리기가 중복 목적을 가지고 있다는 것을 의미합니까? 완료 핸들러를 이미 사용한 경우 동시 디스패치 큐로 마무리 할 필요가 없습니다.

예를 들어 URLSession을 사용하여 시간이 많이 소요되는 데이터로드 작업은 다음과 같습니다. 동시 디스패치 대기열로 포장하는 것이 좋습니다.

URLSession(configuration: URLSessionConfiguration.default).dataTask(with: propertiesRequest) { data, response, error in 
     // print("within dataTask: data: \(data), response: \(response), error: \(error)") 
     if let error = error { 
      print(error) 
     } else if let httpResponse = response as? HTTPURLResponse { 
      if httpResponse.statusCode == 200 { 
       print("success: property task request") 


       do { 

        handler(responseDict, nil) // This is a function supplied by caller 

       } catch let error as NSError { 
        handler(nil, error) 
       } 
      } 
     } 
    } 
+0

'error'가 nil이 아니거나 상태 코드가 200이 아니면 완료 처리기를 호출했는지 확인해야합니다. 호출자는 의심 할 여지없이 요청의 완료 여부, 성공 여부 등을 알고 싶어합니다. – Rob

+0

@ Rob 동의합니다. 내 프로젝트에서 이것을 채택 할 것이다. – modeller

답변

3

GCD (Grand Central Dispatch) 디스패치 대기열을 시간이 많이 걸리는 URLSession 요청과 함께 사용할 필요가 없습니다. 경우는 dataTask 완료 핸들러 폐쇄 내부 GCD를 사용할 수있는 것

:

  1. 당신이 폐쇄 안에 뭔가를하고있는 경우는, 그 자체가 매우 시간 (예를 들어, 매우 복잡한 요청을 처리) 소모하고 돈 URLSession이 완료 처리기 (및 위임 메소드)를 처리하는 데 사용하는 직렬 작업 대기열을 묶고 싶지 않습니다. 여기에서는 문제가되지 않는 것 같습니다 (예 : JSON 응답 구문 분석은 일반적으로 빠르지 만 걱정하지 않아도됩니다.) 다만 FYI입니다. 또는

  2. dataTask의 응답 구문 분석을 마쳤 으면 일부 모델 개체를 업데이트하거나 UI를 업데이트하려는 경우. 메인 대기열에서 처리하고 싶습니다.요청이 일부있는 tableview에 표시 할 개체의 무리를 반환하는 경우

    는 예를 들어,이 모델의 업데이트와 메인 큐에 UI 파견 것 :

    DispatchQueue.main.async { 
        self.objects = ... 
        self.tableView.reloadData() 
    } 
    

을하지만, 시간이 많이 걸리는 URLSession 요청 자체에 대해 걱정할 필요가 없습니다. 이는 이미 비동기 적으로 발생하므로 백그라운드 대기열로 파견 할 필요가 없습니다.

0

DispatchQueue 및 완료 핸들러가 중복되지 않는 것이 아니라 큐를 처리하기위한 완벽한 솔루션으로 사용할 수 있습니다. URLSession의 데이터로드 작업은 이미 비동기이므로 DispatchQueue으로 래핑 할 필요가 없습니다.

DispatchQueue - 성능 향상 (글로벌 대기열)/사용자 환경 (메인 대기열)을 위해 특정 스레드에 작업 할당.

완료 핸들러 - 작업 완료시 특정 코드가 실행됨을 보장합니다. 그러나 달리 명시하지 않는 한 실행은 현재 스레드에서 수행됩니다. 더 중요한 (UI)의 주요 태스크 큐 해방 글로벌 큐 작업 대기열을 DispatchQueue.global.async를 이용하는 방법 A를 호출하기에 예를 들어

example

. 얼마 후 작업이 완료되고 일반적으로 데이터로 무언가를하고 싶습니다. UI와 관련이 있다면 DispatchQueue.main.async으로 전화하여 정보 화면으로 업데이트하고 싶거나 사소한 것이라면 전화를 걸거나 바닐라 코드로 충분할 것입니다.