Swift-멀티스레드 프로그래밍 Operation
프로젝트 데모 코드
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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.