Синхронизированный доступ к логике 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 - это быстро.

Моя догадка? Ваша таблица удаляется (просмотр выгрузки) и может не быть воссоздана при перезагрузке.

Другие вопросы по тегам