2017-11-27 1 views
0

내 프로젝트의 스레드에서 함수를 호출하고 있습니다.iOS 스레딩 및 함수 완료 대기

[self performSelectorInBackground:@selector(shortVibration) withObject: nil]; 

루프에서 호출되었습니다.

고유 한 스레드에서 함수를 호출하고 싶습니다.

그래서, 난 다시는 내 스레드 함수를 호출하고 싶지 않아 나는 그것이 동시에 호출 할 싶지 않아 (이 스레드 전화가 루프에있는 경우 ... 그리고 그것이) 마지막 하나가 실행 완료 될 때까지

어떻게하면됩니까?

+0

1 단계 : 'performSelectorInBackground'를 호출하지 마십시오. 그냥 하지마. NSOperation 및 Grand Central Dispatch가 귀하의 서비스입니다. – matt

답변

0

는이 "시리얼 큐"를 제안 동시에

호출 할 싶지 않아요. 디스패치 큐 또는 작업 큐가 될 수 있습니다. 그러나 직렬 대기열은 한 번에 하나의 작업 만 실행할 수있는 대기열입니다.

반복되는 진동에서 루프를 분리하고 루프가 진행되는 동안 타이머를 설정하여 진동 루틴을 반복적으로 호출 한 다음 루프의 끝에서 타이머를 취소 할 수 있습니다. 표준 NSTimer을 사용하고 원하는 대기열로 호출을 보내거나 백그라운드 대기열에서 예약 할 수있는 GCD 타이머를 사용할 수 있습니다.

이 진동 루틴의 작동 방식과 루프의 특성에 따라 다릅니다. 더 많은 정보를 원하면 (예 : 더 넓은 문제와이 "진동"루틴의 성격을 기술해야 함) 더 도움이 될 것입니다.

0

아마도 자신이 만든 대기열에서 함수를 호출 할 수있게 해주는 NSOperationQueue를 살펴 봐야 할 것입니다. 대기열은 자체 스레드에서 실행됩니다. 예를 들어

: 병렬 실행 작업의 수를 처리 할 수있는 operationCount와

NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc]init]; 
backgroundQueue.maxConcurrentOperationCount = 1; 
backgroundQueue.name = @"com.foo.bar"; 

[_backgroundQueue addOperationWithBlock:^{ 
     do what you want.... here you also have access to properties in your class. 
}]; 

. 또한 NSOperation의 서브 클래스를 만들고 거기에서 코드를 실행할 수 있습니다. 그런 다음 [_backgroundQueue addOperation : SubclassOfNSOperation]과 같은 Operation을 추가해야한다.

조금 도움이 되었기를 바랍니다. 귀하의 질문에서 더 자세한 정보를 얻을 수 없습니다. 몇 가지 코드를 게시하십시오.