2012-04-25 3 views
1
-(void)buttonClick:(id)sender 
{  
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    for(int i=0;i<500000000;i++) 
    { 
     //Simulates network activity 
    } 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

Теоретически, сетевая активность вертушка в верхнем левом углу экрана должен загореться, спина на некоторое время, а затем отключить ... Однако, он никогда не показывает вверх.networkActivityIndicatorVisible не показывать до ее слишком поздно

-(void)buttonClick:(id)sender 
{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    for(int i=0;i<500000000;i++) 
    { 
     //Simulates network activity 
    } 
    //[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

С «= NO» будучи закомментирован, я заметил, что программа проходит через весь цикл, то после завершения для цикла, вертушка, наконец, начинает вращаться.

-(void)viewWillAppear:(BOOL)animated 
{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES 
} 

-(void)buttonClick:(id)sender 
{ 
    for(int i=0;i<500000000;i++) 
    { 
     //Simulates network activity 
    } 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

Теперь, когда появляется представление, индикатор начинает вращаться. Когда я нажимаю кнопку, она продолжает вращаться, пока цикл работает. Когда цикл for заканчивается, счетчик останавливается, как ожидалось.

- = - = - = - = - = - = - = - = - = -

Мой вопрос заключается в следующем, почему не будет начало вертушки спиннинг до после того, как цикл в течение первых 2-й примеров ?

- = - = - = - = - = - = - = - = - = -

Мое мышление до сих пор:

С точки зрения того, почему вертушка не начнет в этом конкретном примере ... Возможно, он отправляет сообщение, но не выполняется после цикла for из-за того, как работает скомпилированный код?

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

- = - = - = - = - = - = - = - = -

Любые советы/ответы приветствуются. Заранее спасибо. Имейте в виду, что это приложение предназначено для iPad.

+0

Я думаю, что вы ответили на свой вопрос. – onnoweb

+0

Возможно ... Я все еще изучаю эту проблему и ищу «правильный» способ осуществления сетевой активности. – Highrule

ответ

3

Пользовательский интерфейс не будет обновляться до конца текущего цикла выполнения. В настоящий момент ваш метод блокирует основной поток при выполнении его работы, что не дает вашей программе возможности дойти до конца runloop.

Так что вам нужно сделать, это взять длинную выполняемую задачу от основного потока

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 

    for(int i=0;i<500000000;i++) 
    { 
     //Simulates network activity 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    }); 
}); 
+0

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

+0

Поцарапайте это, у меня был другой код, который замедлял работу. Это прекрасно работает! – Highrule

+0

Технически это может привести к возврату той же очереди каждый раз, когда вы нажмите кнопку так, чтобы по существу работа очереди продолжала наращиваться, поэтому вы можете увидеть эффект от всех этих заданий, которые держат друг друга. –

1

Создайте метод для // Имитировать сетевой активности вещи и просто вызвать этот метод с

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

Что-то вроде:

-(void)buttonClick:(id)sender 
{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 
     [self performSelector:@selector(simulateNetworkActivity) withObject:nil afterDelay:0]; 
    }); 
} 

Способ, содержащий что-то вроде:

-(void)simulateNetworkActivity 
{ 
    for(int i=0;i<500000000;i++) 
    { 
     //Simulates network activity 
    } 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 
+0

Я уже использовал этот метод раньше, но он не делает того, к чему мы стремимся. Ваш метод говорит: «Через X секунд вызовите метод simulateNetworkActivity». Кроме того, сетевой счетчик активности по-прежнему не отображается с вашим кодом =/ – Highrule

+0

... После другого взгляда, выполняет ли функцияSelector на самом деле выплескивает новый поток для запуска этого метода? – Highrule

+0

Вы были верны.Я всегда использую NSOperation для более тяжелых вычислений и вещей :) Но я добавил код, чтобы легко решить async. – Nic

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