Синхронизированный доступ к логике UITableViewDelegate - PullRequest
1 голос
/ 22 октября 2011

Я хотел бы задать вопрос о табличном представлении и @synchronized контракте.Я должен выполнить код внутри 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 Ответ

0 голосов
/ 22 октября 2011

@synchronized здесь не нужно.

  • вы можете ожидать, что вызов делегата будет сделан из основного потока (при условии, что вы не вызываете его).
  • dispatch_once кажется необычным выбором здесь. если вы уверены, что это хорошо, попробуйте pthread_once для iOS 3. Это странно, потому что он работает с использованием изменяемого глобального состояния. IOW, «Я только хочу сделать один стол».
  • тестирование BOOL выполняется быстро.

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

...