0

我有一个看似简单的问题,我似乎一辈子都无法弄清楚。在我的 iOS 应用程序中,我有一个UICollectionView在点击它时触发网络操作,可能需要几秒钟才能完成。在下载信息时,我想显示一个UIView在单元格中填充一个UIActivityIndicatorView位于正方形中的 a,直到加载完成并触发 segue。问题是它永远不会出现。现在我的代码看起来像:

myLoadView.hidden = NO;
//Network Operation
myLoadView.hidden = YES;

该应用程序只需停止几秒钟,然后移动到下一个视图。我想 Grand Central Dispatch 与解决方案有关,但是请记住,此代码发生在 中prepareForSegue,并且网络信息需要传递给下一个视图。因此,在切换场景之前没有完成下载有一个明显的问题。任何帮助将不胜感激。谢谢!

4

4 回答 4

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;
    });
});
于 2013-06-10T06:23:39.137 回答
0

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

于 2013-06-10T07:46:39.023 回答
0

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

要解决此问题,请使您的调用异步。

如果您还没有,您应该完整阅读此内容。

于 2013-06-10T06:47:41.923 回答
-1

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

于 2013-06-10T06:13:39.940 回答