NSRecursiveLock을 사용하여 백그라운드 스레드에서 작업이 완료 될 때까지 의도적으로 대기 할 수 있습니까? 여기에 예제가 있습니다 :NSRecursive 잠금을 사용하여 작업이 완료 될 때까지 대기합니다.
나는 비동기 또는 동기가 될 수있는 loadParts 함수를 갖고 싶은 클래스가 있습니다. 비동기 함수는 일찍 호출되어 데이터가 실제로 필요하기 전에 부품을로드 할 수 있습니다. 동기식 데이터는 데이터가로드되었는지 또는 현재로드 중인지를 확인해야합니다. 로드 된 경우 데이터를 반환 할 수 있습니다. 현재로드 된 경우,로드 될 때까지 기다린 후 리턴해야합니다. 로드되고 있지 않은 경우에도 동 기적으로로드해야합니다. 이것은 사용하려고 시도하는 코드입니다.
// Private function to be run either on main thread or
// background thread
-(void)_loadParts
{
[_loadingPartsLock lock];
_loadingParts = YES;
// Do long loading operation
_loadingParts = NO;
_partsLoaded = YES;
[_loadingPartsLock unlock];
}
// Asynchronous loading of parts
-(void)preloadParts
{
if(_loadingParts || _partsLoaded)
return;
[self performSelectorInBackground:@selector(_loadParts) withObject:nil];
}
// Synchronous loading of parts
-(void)loadParts
{
if(_loadingParts)
{
[_loadingPartsLock lock];
[_loadingPartsLock unlock];
}
if(!_partsLoaded)
{
[self _loadParts];
}
}
이렇게하는 것이 안전하고 효율적인 방법입니까? 이미 몇 가지 문제가 있습니다. 잠금없이 BOOL의 값을 설정하고 테스트하는 것이 안전합니까? 또한 백그라운드 스레드가로드되는 동안 호출되는 경우 동기 함수에서 두 번 잠글 수 있습니다.
이 기능을 구현하는 더 일반적인 방법이 있습니까?
감사합니다.
나는 우리가 NSCondition이 왜이 생각 여기에 내가 생각 해낸 코드입니다. –