我有一个有点复杂的 iOS 用户界面,我需要每秒重新加载 UICollectionView 的特定单元格以显示时间(有点像复杂的秒表),我还需要在这个调用中每秒做一些其他事情.
问题的第 1 部分
我的问题是解决此类问题的最佳做法是什么?
选项 1(使用递归调用)
- (void)viewDidLoad
{
[self runUpdateDisplayLoop];
}
- (void)runUpdateDisplayLoop
{
//do stuff (reload cell, etc)
//Recurissively Call Every Second
dispatch_async(dispatch_get_main_queue(), ^{
[self performSelector:@selector(runUpdateDisplayLoop) withObject:nil afterDelay:1.0];
});
}
选项 2(使用 NSTimer)
- (void)viewDidLoad
{
NSTimer *updateDisplayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(runUpdateDisplayLoop:)
userInfo:nil
repeats:YES];
}
- (void)updateDisplayLoop:(NSTimer *) theTimer
{
//do stuff (reload cell, etc)
}
问题的第 2 部分
无论哪种情况,启动和终止这些循环的最佳位置是什么?
如果我将它们放在 ViewDidLoad 中,即使我已经离开相关视图,它们也会继续被调用,我宁愿只在需要时运行循环。另一方面,每次显示视图时都必须运行循环(即使视图已以各种方式关闭 - 应用程序关闭并重新打开、电话中断等)。关于应用程序生命周期,我的目标是 iOS 5 和 iOS 6。
我猜有一个涉及“viewWillAppear”和“viewWillDisappear”的解决方案,但我对进入其中一个或另一个不被调用的情况持怀疑态度。我也不想通过做出任何错误的假设来产生多个循环。