-(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。
答案 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;
}