使用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。 – 2011-03-30 04:20:07