2012-07-18 63 views
0

我在工作的应用程序中有一个功能,与其他操作相比,它有时需要相当长的时间。我希望在执行该功能时显示图像,以向用户显示应用程序仍能正常工作。何时刷新UIView?是否有可能强制中功能刷新?

的方式我尽管可以做的是:

_checkImpossibleImage.hidden = NO; 
bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
_checkImpossibleImage.hidden = YES; 

从本质上讲,这将图像设置为可见,执行的功能,然后将图像设置为不可见。但是,直到执行本节中的所有代码之后,视图才会更新。下面是功能全面:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0){ 
     // Do nothing (cancel option selected) 
    } else { 
     if (_buttonKey == @"New") { 

      _checkImpossibleImage.hidden = NO; 
      bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
      _checkImpossibleImage.hidden = YES; 

      ... 
     } 
    ... 
    } 
} 

有没有办法来迫使当前视图更新或是否有更好的方法来创建一个“加载”弹出而函数执行?

+0

你可能想看看进入[UIView文档](http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/setNeedsDisplay),特别是'needsDisplay'这将强制重绘。但是,我不知道发生在功能中间的重绘。 – 2012-07-18 00:06:18

+0

基本上同样的问题:[UIActivityIndi​​cator工作不正常?](http://stackoverflow.com/questions/2919879/uiactivityindicator-not-working-properly) – 2012-07-18 00:33:24

+0

此解决方案工作!谢谢你指出我朝着正确的方向。 – Valentine 2012-07-18 17:34:42

回答

0

当你这样做的时候,你不应该阻塞UI,我认为如果你只是在一个单独的线程中调用花费很长时间的方法会更好。

+0

我不认为它会在另一个线程中调用该函数,因为它对于以下应用程序行为至关重要。完成时间不需要很长的时间,大概是10秒,但我认为通知用户此事件正在发生将是有益的。 – Valentine 2012-07-18 00:25:43

+0

如果在此方法完成之前应用程序无法继续,则可以在您调用该方法之前向用户显示一些“加载...”视图。 – Eyal 2012-07-18 00:30:05

+1

实际上10s太长以至于无法阻止用户界面。你应该在后台进行处理,然后发送通知(或类似的)让你的应用继续下一步。 – nielsbot 2012-07-18 00:43:04

0

绘图直到运行循环结束才会发生;在代码中间无法实现它。你可以把它放在主调度队列延迟,直到循环的下一次复飞的呼叫isPossible::(这是一个贫穷的方法名,顺便说一句):

_checkImpossibleImage.hidden = NO; 
dispatch_async(dispatch_get_main_queue(), ^{ 
     bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
     _checkImpossibleImage.hidden = YES; 
     // More code to deal with the value of ratioIsPossible 
}); 
+0

我不确定这是否是一个合适的响应,因为它是作为对按钮按下的警报视图按钮的响应而发生的,因此推测该功能在下次按下按钮时才会再次运行。然而,你能否给我一些关于更好的命名约定的建议? – Valentine 2012-07-18 17:10:05

+0

我不明白你的意见。为什么该方法需要再次运行? – 2012-07-18 17:11:29

+0

嗯,也许我只是不太明白你建议的解决方案。当你说循环的下一个复飞时,你的意思是什么?我对使用Objective-C和Xcode相当陌生,所以我对整个过程和行为并不特别熟悉。 – Valentine 2012-07-18 17:19:29