NSOperation 멀티스레드에 대한 간단한 이해
NSOperation의 작업: NSOperation과 NSOperationQueue를 함께 사용해도 다중 루틴 프로그래밍을 실현할 수 있고 NSOperation은 start 방법을 조정하여 작업을 수행할 수 있지만 기본적으로 동기화됩니다.
NSOperationQueue: NSOperationQueue(작업 대기열)에 NSOperation을 추가하면 NSOperation의 작업 추가 작업이 NSOperationQueue에 자동으로 비동기적으로 수행되고 작업이 자동으로 실행되며 스레드가 자동으로 켜집니다.
NSOperation 및 NSOperationQueue의 멀티스레드 구현 단계:
(1) 먼저 수행해야 할 작업을 NSOperation 객체로 캡슐화합니다.
(2) NSOperation 객체를 NSOperationQueue에 추가
(3) 시스템이 NSOperationQueue의 NSOperation을 제거합니다.
(4) 제거된 NSOperation 캡슐화 작업을 새 스레드에 배치합니다.
2. NSOperation의 하위 클래스
NSOperation 은 추상 클래스로서, 봉인 작업 능력을 갖추지 못하므로, 반드시 그 하위 클래스를
NSOperation 클래스를 사용하는 3가지 방법은 다음과 같습니다.
(1)NSInvocationOperation
(2)NSBlockOperation
(3) 자정의 자류가 NSOperation을 계승하여 내부 상응하는 법을 실현한다.
(4) NSOperation 은 대기열의 취소, 일시 정지, 복구를 할 수 있습니다.
: tableview , , UI , 。 , UI( ) , ( ), , 。
NSOperation 은 작업을 실행하기 위해 start 방법을 조정할 수 있지만, 기본값은 동기화됩니다.
//1. NSInvocationOperation
NSInvocationOperation *invocationOperation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationOperationAction) object:nil];
//2.
[invocationOperation start];
//1. NSBlockOperation
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
}];
//2.
[blockOperation start];
//** : , 。 , queue , 。 NSOperation NSOperationQueue , **
NSBlockOperation의 캡슐화된 작업 수 > 1이면 비동기적으로 수행됩니다.
// NSBlockOperation
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
}];
//
[blockOperation addExecutionBlock:^{
}];
//
[blockOperation addExecutionBlock:^{
}];
//
[blockOperation start];
//** : NSBlockOperation > 1, **
NSOperationQueue에 작업 추가, 작업 자동화, 스레드 자동 켜기
** **
// NSOperationQueue
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
// NSOperation
NSInvocationOperation *operationOne=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationOneAction) object:nil];
NSInvocationOperation *operationTwo=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationTwoAction) object:nil];
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
}];
//
[operationQueue addOperation:operationOne];
[operationQueue addOperation:operationTwo];
[operationQueue addOperation:blockOperation];
** **
[operationQueue addOperationWithBlock:^{
}]
NSOperation 설정 운영 의존성
// NSOperationQueue
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
// NSOperation
NSInvocationOperation *operationOne=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationOneAction) object:nil];
NSInvocationOperation *operationTwo=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationTwoAction) object:nil];
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
}];
//
// operationTwo, operationOne, blockOperation
[blockOperation addDependency:operationOne];
[operationOne addDependency:operationTwo];
//
[operationQueue addOperation:operationOne];
[operationQueue addOperation:operationTwo];
[operationQueue addOperation:blockOperation];
NSOperationQueue 스레드 대기열 완료finished 상태 감지
우리는 대기열이 완성된 후에 작업을 해야 할 때가 많은데, 언제 대기열이 완성될지 NSOperationQueue는 내장된didFinishedSelector가 사용되지 않기 때문에 스스로 상태를 검사해야 한다.NSOperationQueue는 키-value coding(KVC) and 키-value observing(KVO) 메커니즘을 호환하기 때문에 NSOperationQueue의 속성을 관찰할 수 있습니다.NSOperationQueue에서 모니터링하고 관찰할 수 있는 속성은 다음과 같습니다.
operations 、operationCount、maxConcurrentOperationCount、suspended
self.operationQueue =[[NSOperationQueue alloc]init];
[ self.operationQueue addObserver:self forKeyPath:@"operations" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context
{
if (object == self.operationQueue && [keyPath isEqualToString:@"operations"])
{
if (0 == self.operationQueue.operations.count)
{
NSLog(@"=======parse finished=======");
}
}
else
{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.