我有一个看似简单的问题,我不能为我的生活似乎弄清楚。在我的iOS应用程序中,我有一个UICollectionView
触发网络操作,可能需要几秒钟才能完成。在下载信息时,我想显示一个UIView
,用UIActivityIndicatorView
填充单元格,该myLoadView.hidden = NO;
//Network Operation
myLoadView.hidden = YES;
位于正方形中,直到加载完成,并触发segue。问题是它永远不会出现。现在我的代码看起来像:
prepareForSegue
应用程序只需停止几秒钟,然后移动到下一个视图。我认为Grand Central Dispatch与解决方案有关,但请记住,此代码发生在{{1}},网络信息需要传递到下一个View。因此,在切换场景之前没有完成下载有一个明显的问题。任何帮助都将非常受欢迎。谢谢!
答案 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)
答案 2 :(得分:0)
正如其他答案所提到的,问题是UIView更改不会发生,直到当前方法完成运行,这是你阻塞的地方。在GCD可用之前,我会将方法拆分为两个并使用performSelector:withObject:afterDelay
(在UI循环中也运行第二部分)或在第一个方法结束时使用performSelectorInBackground:withObject:
。这将首先提交所有等待动画,然后在第二种方法中执行实际任务。
答案 3 :(得分:-1)
此类指示的更好选择是使用自定义HUD库,如SVProgressHUD或MBProgressHUD