networkActivityIndi​​catorVisible直到为时已晚才显示

时间:2012-04-25 19:35:32

标签: objective-c ipad

-(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。

2 个答案:

答案 0 :(得分:3)

在当前运行循环结束之前,UI不会更新。你的方法当前阻止了主线程,同时做了它的工作,这不会让你的程序有机会到达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;
    });
});

答案 1 :(得分: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;
}