使UIView出现在网络操作之前

时间:2013-06-10 04:52:01

标签: ios objective-c uiview grand-central-dispatch

我有一个看似简单的问题,我不能为我的生活似乎弄清楚。在我的iOS应用程序中,我有一个UICollectionView触发网络操作,可能需要几秒钟才能完成。在下载信息时,我想显示一个UIView,用UIActivityIndicatorView填充单元格,该myLoadView.hidden = NO; //Network Operation myLoadView.hidden = YES; 位于正方形中,直到加载完成,并触发segue。问题是它永远不会出现。现在我的代码看起来像:

prepareForSegue

应用程序只需停止几秒钟,然后移动到下一个视图。我认为Grand Central Dispatch与解决方案有关,但请记住,此代码发生在{{1}},网络信息需要传递到下一个View。因此,在切换场景之前没有完成下载有一个明显的问题。任何帮助都将非常受欢迎。谢谢!

4 个答案:

答案 0 :(得分:2)

iOS在设定例程后提交接口更改。因此,您应该在后台线程中执行网络操作,然后返回主要并执行“显示我现在的视图”。看看下面的代码供参考。

myLoadView.hidden = NO;
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    //Network Operation
    dispatch_async(dispatch_get_main_queue(), ^{
        myLoadView.hidden = YES;
    });
});

答案 1 :(得分:0)

您的网络操作似乎是在主线程(即UI线程)上执行的。这将阻止所有进一步的UI调用,包括取消隐藏视图的调用,直到完成。

要解决此问题,请使您的呼叫异步。

如果您还没有,请完整阅读this

答案 2 :(得分:0)

正如其他答案所提到的,问题是UIView更改不会发生,直到当前方法完成运行,这是你阻塞的地方。在GCD可用之前,我会将方法拆分为两个并使用performSelector:withObject:afterDelay(在UI循环中也运行第二部分)或在第一个方法结束时使用performSelectorInBackground:withObject:。这将首先提交所有等待动画,然后在第二种方法中执行实际任务。

答案 3 :(得分:-1)

此类指示的更好选择是使用自定义HUD库,如SVProgressHUDMBProgressHUD