Swift-멀티스레드 프로그래밍 Operation

3147 단어
관련 기사: NSOperation
프로젝트 데모 코드
1. NSOperation 하위 클래스
NSOperation 은 하위 클래스를 사용해야 하는 캡슐화 작업을 수행하는 추상 클래스입니다.
1, NSInvocation Operation (Swift 에서 지원되지 않음)
기본적으로 스레드를 열지 않습니다. 현재 스레드에서만 작업을 수행할 수 있습니다. Operation과 OperationQueue를 통해 다중 스레드를 실현할 수 있습니다
2、BlockOperation:
BlockOperation에서 봉인된 작업 수 > 1만 있으면 비동기적으로 작업을 수행하지만, 무제한으로 라인을 만들지는 않습니다
 let blockOpe = BlockOperation()
  blockOpe.queuePriority = .veryHigh
  blockOpe.addExecutionBlock {
  print("BlockOperation   ",Thread.current)
        }
  blockOpe.addExecutionBlock {
  print("BlockOperation2   ",Thread.current)
    }
  blockOpe.start()  //    
  //blockOpe.cancel() //  

2. NSOperationQueue
1. 대기열 만들기
홈열을 가져오고 대기열에 작업을 추가합니다. 홈열은 직렬 대기열입니다. 최대 병렬 수량을 설정하든지 말든지 현재 라인에서 실행되며 새로운 라인을 만들지 않습니다.
 let queue = OperationQueue.main
 queue.addOperation {}


직렬과 병렬 기능을 동시에 갖추고 있으며 기본적으로 병렬로 되어 있으며 수동으로 직렬 대기열로 설정할 수 있으며 최대 병렬 속성을 설정하여 변경할 수 있습니다
 let queue = OperationQueue()
 queue.maxConcurrentOperationCount = 1
  queue.addOperation {
    for _ in 0...50000{
       print("OperationQueue1   ",Thread.current)
        }
   }
   //addOperation        start   

2. 최대 동시 발생
1. 대기열의 모든 작업을 취소합니다. 실행 중인 작업을 제외하고 취소되면 이전의 작업에 회답할 수 없습니다.
2. 최대 조작수의 값을 1로 설정하면 작업의 직렬 효과를 실현할 수 있지만 주의해야 할 것은 한 개의 라인만 켜는 것이 아니다(보통 두 개의 라인을 켜서 재활용한다)
3. 최대 병발수 6 이내, 너무 많이 켜지 마십시오. 비록 작업은 하위 라인에서 처리되지만, cpu가 이런 너무 많은 하위 라인을 처리하면 UI에 영향을 주고 UI가 끊길 수 있기 때문입니다.
queue.maxConcurrentOperationCount=2;


3. 대기열의 취소
현재 실행 중인 작업은 취소할 수 없고 대기 중인 작업만 취소할 수 있습니다
queue.cancelAllOperations()

4. 대기열의 일시 중지와 복구
현재 실행 중인 작업은 일시 중지할 수 없고 기다리는 작업만 일시 중지할 수 있습니다
queue.isSuspended = true    //    
queue.isSuspended = false  //    

5. Options 완료 대기
현재 라인에서operation이 완성된 결과를 처리해야 한다면 NSOperation의waitUntilFinished 방법으로 현재 라인을 막고operation이 완성되기를 기다릴 수 있습니다
//        ,    operation      
[operation waitUntilFinished];


NSOperationQueue의 waitUntilAllOperationsAreFinished 방법을 사용합니다
//       ,  queue           
[queue waitUntilAllOperationsAreFinished];


6. NSOperation의 종속 객체 추가
어떤 NSOperation 대상이 다른 NSOperation 대상의 완성에 의존할 때 addDependency 방법으로 하나 이상의 의존 대상을 추가할 수 있으며, 모든 의존 대상이 이미 조작을 완성해야만 현재 NSOperation 대상이 조작을 시작할 수 있다.또한 removeDependency 방법을 통해 의존 대상을 삭제한다.
//      
let blockOpe1 = BlockOperation()
blockOpe1.addExecutionBlock {
print("blockOpe1   ")
}
let blockOpe2 = BlockOperation()
 blockOpe2.addExecutionBlock {
print("blockOpe2   ")
}
blockOpe1.addDependency(blockOpe2)
queue.addOperation(blockOpe1)
queue.addOperation(blockOpe2)
    ,   blockOpe2,   blockOpe1

7. Operations의 실행 순서 수정
기본적으로 모든operation은 '일반' 우선 순위를 가지고 있지만 setQueuePriority: 방법으로 Operation 대상의 우선 순위를 올리거나 낮출 수 있습니다.
 let blockOpe = BlockOperation()
  blockOpe.queuePriority = .low
  queue.addOperation(blockOpe)  

좋은 웹페이지 즐겨찾기