나는이 방법IOS 스레드 풀
-(void)addObjectToProcess(NSObject*)object;
있어 내가 병렬로 4 개의 물체를 처리 할 수있는 프로세스 큐에 객체를 추가하려면이 방법을 원한다.
난 내 자신의 dispatch_queue을 작성
_concurrentQueue = dispatch_queue_create([queue_id UTF8String],DISPATCH_QUEUE_CONCURRENT);
_processSema = dispatch_semaphore_create(4);
을 semhphore 및 방법의 구현은했습니다
-(void)addObjectToProcess(NSObject*)object {
dispatch_semaphore_wait(self.processSema, DISPATCH_TIME_FOREVER);
__weak MyViewController* weakSelf = self;
dispatch_async(self.concurrentQueue, ^{
// PROCESS...........
// ..................
dispatch_semaphore_signal(self.processSema);
dispatch_async(dispatch_get_main_queue(), ^{
// call delegate from UI thread
});
});
}
는 호출자가 때때로 세마포어 장벽의 차단 원인을 얻을 것 같다.
내가 여기 만들려고하는 것을 구현하는 다른/쉬운 옵션이 있습니까?
감사
그런데 세마포어 문제 외에도 코드에는 두 가지 문제가 있습니다. 첫째,'weakSelf'는 당신이 원하는 것을 성취하지 못할 것입니다. 왜냐하면 클로저 내부에 참조 자체가 있기 때문에 View Controller에 대한 강력한 참조를 유지하기 때문입니다. 약한 참조는 아무에게도 해당되지 않습니다. 둘째로, closure 내부의 'self'참조를'weakSelf'로 대체하는 것만으로는 충분하지 않습니다. 왜냐하면 그것은 경쟁 조건을 도입하기 때문입니다. 클로저 안에 새로운'strongSelf' 레퍼런스를 만들어야합니다 ('self'를 참조하는 것이 아니라'weakSelf'에 대한 새로운 강력한 참조를 만드는 것입니다). – Rob