我有一个iOS应用程序,为有时间限制的用户提供测试。
测试将跨越多个视图控制器,这些视图控制器可能会在测试流程中重新打开。我想到以下流程:
在AppDelegate.h
中,添加NSTimer
以及在float
中花费的时间:
@property (strong, nonatomic) NSTimer *timer;
@property (nonatomic) float timeSpent;
- (void)startTimer;
- (void)stopTimer;
不要忘记@synthesize
以上内容,请先启动& AppDelegate.m
中的停止计时器功能:
- (void)startTimer {
self.timer = [NSTimer scheduledTimerWithTimeInterval: 0.1f target: self
selector: @selector(updateTime) userInfo: nil repeats: YES];
}
- (void)stopTimer {
[self.timer invalidate];
}
在定期调用的updateTime
函数中,将timeSpent
的值增加1。
最后,在每个View Controller中,获取timeSpent
值并使用我想要的格式对其进行格式化,例如" 01min 56s"或" 01:56"
有更简单的方法吗?
注意:
答案 0 :(得分:2)
你是正确的,你需要一个NSTimer和变量来跟踪全球时间和.. 你提出的建议,使用app delegate作为一个荣耀的单身人士将会工作..
但请不要,这不是很好的做法。至少在我看来,这篇博文简要介绍了为什么。 http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
就个人而言,我可能只是使用依赖注入模型并在viewControllers之间传递NSTimer。 http://www.objc.io/issue-15/dependency-injection.html
简而言之,app委托可能是最简单,最快捷的方式。但是如果它不是一个简单的应用程序,我会建议一些更具可扩展性的东西。
希望这很有用:)
*编辑单身人士的示例代码。
这应该在单例类的顶部进行初始化。
@interface
@property (nonatomic, strong) NSTimer *myTimer;
@end
@implementation MySingletonClass
+ (instancetype)shared
{
static MySingletonClass *_shared = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_shared = [[self alloc] init];
// any other initialisation you need
});
return _shared;
}
- (void)startTimer {
self.myTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1f target: self
selector: @selector(updateTime) userInfo: nil repeats: YES];
}
- (void)stopTimer {
[self.myTimer invalidate];
}
然后您可以从程序中的任何其他类访问它,如
#import "MySingletonClass.h"
//some method
- (void)myMethod
{
CGFloat currentTime = [MySingletonClass shared].globalTimeProperty;
// do something with the time
}
-(void)startTimer
{
[[MySingletonClass shared] startTimer];
}
-(void)updateTime
{
// do your update stuff here
}
Singleton标题
@interface
@property (nonatomic, assign) CGFloat globalTimeProperty;
+ (instancetype)shared;
- (void)startTimer;
- (void)stopTimer;
@end
我可能错过了一些东西,但它应该足以让你去。