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

从理论上讲,屏幕左上角的网络活动微调器应该打开,旋转一段时间,然后关闭......但是,它永远不会出现。

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

注释掉“= NO”后,我注意到程序运行了整个 for 循环,然后在 for 循环完成后,微调器终于开始旋转。

-(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 循环结束时,微调器按预期停止。

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

我的问题是,为什么在前两个示例中的 for 循环之后,微调器才会开始旋转?

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

到目前为止我的想法:

至于为什么微调器不会在这个特定示例中启动......也许它发送了消息,但直到 for 循环之后才被执行,因为编译的代码是如何工作的?

这样做的正确方法可能是启用网络活动指示器,然后关闭另一个执行网络活动的线程,然后该线程在完成后将消息发送回主线程(大概还有它检索到的数据)

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

任何建议/答案表示赞赏。提前致谢。请记住,此应用程序适用于 iPad。

4

2 回答 2

3

UI 在当前运行循环结束之前不会更新。您的方法当前在工作时阻塞了主线程,这不会让您的程序有机会到达运行循环的末尾。

所以你需要做的是把你长时间运行的任务从主线程中取出

[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;
    });
});
于 2012-04-25T20:42:41.737 回答
1

为 //Simulate 网络活动的东西创建一个方法,然后调用该方法

- (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;
}
于 2012-04-25T20:02:47.600 回答