2016-11-21 8 views
0

저는 Swift 3으로 변환 된 프로젝트의 기존 Swift 코드를 정리하는 작업을했습니다. 그러나이 문제가 계속 의심 스럽습니다. 여기 NSOperationQueues는 할당 해제되기 전에 항상 대기열을 완료합니까?

OperationQueue().addOperation(someOperation) 

  • ... 내가 가지고있는 문제/문제입니다 큐 인스턴스가 생성되어 바로 사용됩니다. 그곳에 대한 참조는 다른 곳에 사용하기 위해 저장되지 않습니다.
  • 위와 같이 인해 대기열에 하나의 작업 만 있으므로 대기열을 사용하는 이유는 무엇입니까?
  • 아무도 대기열에 대한 참조를 보유하고 있지 않으므로 ARC에서 즉시 할당을 해제하지 않아야하며, 그렇다면 지금 실행중인 작업 자체는 어떻게됩니까? 중단되거나 중단되거나 아직 완료 되었습니까?

어쨌든, 나는 뭔가를 놓치고 있는지 또는이 코드를 이해하게하는 NSOperationQueue 및 NSOperations의 '기능'을 모르고 있는지 궁금합니다. 누구든지이 일에 대해 비추어 줄 수 있습니까, 아니면 이것이 나쁜 습관이라고 생각합니까?

답변

0

이 패턴을 보았습니다. 나는 그것이 NSURLConnection과 같이 작동한다고 생각한다 : NSOperationQueue는 그것이 "보류 중"이라는 연산을 가지고 있으며 즉시 존재하지 못하게한다. 또한 NSOperationQueue는 실제로 "사물"이 아니라는 점도 기억하십시오. 기본 디스패치 대기열의 일종입니다.

대기열에 대한 참조를 저장할 적당한 장소가없는 상황에서이 패턴을 사용하는 것이 좋습니다. this example 에서처럼 작업에 종속성이 있으며 모든 종속성이있을 때까지 실행되지 않으므로 강력한 효과를 낼 수 있습니다.

그러나 개인적으로 NSOperation 기능을 사용하지 않는다면 GCD를 직접 사용하는 경향이 있습니다.

(중간 점은 메인 스레드에서 실행하는 것이 좋지 않을 수 있습니다. 조작이 길면 어떻게 될까요? 메인 스레드를 차단할 것입니다. "다른 모든 일 후에 이것을해라."라고 말하면서 Swift는 당신에게 defer를 준다.)

+0

나의 점 2에 관해서, 나는 그것을 게시하자 마자 그 실수를 깨달았지만 회의에 부딪쳤다. 지금 바로 수정하십시오 ... – MarqueIV

+0

대기열의 목적은 백그라운드 스레드에 도달하는 것입니다. 이는 정상적인 상황에서 GCD를 직접 사용하여 수행 할 것이라고 말했습니다. 그러나 NSOperation을 사용하면 GCD만으로는 할 수없는 일을 할 수 있으며 이러한 상황에서는 이와 같은 패턴을 사용할 수 있습니다. GCD는 상대적으로 새로운 반면 NSOperation은 훨씬 더 긴 역사를 가지고 있음을 명심하십시오. 따라서이 패턴은 희미한 과거 (단지 추측)에서 커질 수 있습니다. – matt