Я использую программное обеспечение с открытым исходным кодом TMCache. Он экономит дорогостоящие данные для кеширования асинхронно. Существует также синхронный метод.Проблема с `dispatch_semaphore_wait()` на некоторых устройствах?
Он использует dispatch_semaphore_wait()
, чтобы подождать, пока операция не закончится.
- (id)objectForKey:(NSString *)key
{
if (!key)
return nil;
__block id objectForKey = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self objectForKey:key block:^(TMCache *cache, NSString *key, id object) {
objectForKey = object;
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
#if !OS_OBJECT_USE_OBJC
dispatch_release(semaphore);
#endif
return objectForKey;
}
Это прекрасно работает на моей машине. На машине коллеги это не так. Программа перестает работать на dispatch_semaphore_wait()
. Это абсолютно не воспроизводимо для меня.
Вышеуказанный метод называется tableView:viewForTableColumn:row:
,
поэтому он выполняется в главной очереди.
Любая идея, почему это происходит? Должен ли я использовать этот метод в другой очереди?
Возможно, проблема заключается в 'objectForKey: block'. Вы уверены, что блок выполняется на компьютере вашего коллеги? –
@MarceloFabri Я уверен, что это не так, если бы это было так, семафор был бы сигнализирован, и очередь была бы разблокирована. Но почему это не выполнено ... – NSAddict
Может быть, 'key'' 'nil'? –