Синхронизированный доступ к логике UITableViewDelegate
Я хотел бы задать вопрос о представлении таблицы и @synchronized
contruct. Я должен выполнить код внутри didSelectRowAtIndexPath
один раз, даже если пользователь продолжает нажимать на ячейку таблицы...
У меня есть таблица, используемая как меню в игре. Я хотел бы предоставить синхронизированный доступ к логике, реализованной в didSelectRowAtIndexPath
,
Я пишу следующий код:
//condition = YES in init code
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
@synchronized( self)
{
if( !condition)
{
NSLog(@"multiple execution is not allowed...");
return;
}
condition = NO;
...
//code
...
}
}
Я протестировал его на своем ipone 3gs с ios 4.3.4 и работал (я сделал тесты и поведение такое, как ожидалось), но мой клиент проверил его на своем 3g с установленным ios 3.x, и, похоже, он не работает.
Я думал об использовании GCD (путем включения кода в dispatch_once()
), но поддерживается начиная с ios 4.x.
Есть ли у вас понимание, почему @synchronized
не работает на телефоне моего клиента?
Спасибо!
1 ответ
@synchronized
не должно быть не нужно здесь.
- Вы можете ожидать, что вызов делегата будет сделан из основного потока (при условии, что вы не вызываете его).
dispatch_once
кажется необычным выбором здесь. если вы уверены, что это хорошо, попробуйтеpthread_once
для iOS 3. это странно, потому что он работает с использованием изменяемого глобального состояния. IOW, "Я только хочу сделать один стол".- Тестирование BOOL - это быстро.
Моя догадка? Ваша таблица удаляется (просмотр выгрузки) и может не быть воссоздана при перезагрузке.