2013-11-20 7 views
0

В настоящее время я пишу игру для платформы iOS. Я дошел до того, что данные о играх, в которых участвует участвующий в регистрации пользователь, успешно загружаются с сервера, и я использую GCDAsyncSocket для TCP.Дождаться, когда данные будут загружены без остановки

Прямо сейчас у меня есть представление (с контроллером вида), которое отображается во время загрузки данных. Это представление имеет индикатор загрузки, который вращается во время загрузки данных. У меня также есть кнопка, которая изначально отключена, но должна быть включена после получения данных.

Теперь вопрос в том, как я могу заставить индикатор загрузки продолжать вращаться, а кнопка отключена, пока NSArray, содержащий игры, не заполнится запрошенным количеством объектов Game? Если я сделаю

while([gamesArray count] == 0){ 
    <do nothing> 
} 

Я останавливаю приложение, и индикатор загрузки не будет вращаться вообще. Однако, если я выполняю проверку if, я рискую, что кнопка, которая переводит пользователя в следующее представление, включена до того, как будут загружены все игры ... Это приводит к ошибкам в списке игр.

Каков правильный способ сделать это? Я хочу, чтобы индикатор продолжал вращаться и кнопка была отключена до тех пор, пока длина массива не будет равна 0 (это означает, что AsyncSocket заполнил его объектами с сервера).

Заранее благодарен!

+1

Как вы получаете объекты Game, используя GCDAsyncSocket? Вы должны использовать неблокирующий '- (void) сокет: (GCDAsyncSocket *) отправитель didReadData: (NSData *) данные с помощью метода делегата callbackTag: (long) tag'. В рамках этого метода обратного вызова вы можете выполнить проверку, если у gamesArray запрошено количество игровых объектов. Если да, вы можете включить кнопку и скрыть индикатор загрузки. – crizztus

+0

Существует десяток различных конкретных схем, но в целом вы запускаете загрузку, отключите соответствующие кнопки, запустите счетчик и вернитесь в цикл событий. Когда загрузка завершена, вы получаете вызов уведомления/делегата, который вы используете для включения кнопок и уничтожения счетчика. –

+0

Спасибо, вы оба. Это очень помогло :) –

ответ

0

Вы должны показать индикатор загрузки и отключить кнопку на основном потоке, затем вызвать фоновый поток для загрузки данных, а затем скрыть индикатор и включить кнопку в основном потоке.

Смежные вопросы