计算时间花费在多个视图控制器ios上

时间:2014-08-19 09:04:53

标签: ios objective-c

我有一个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"

有更简单的方法吗?

注意:

  • 没有可用的互联网连接,测试只能持续约10分钟;因此使用谷歌分析是一个矫枉过正的过程。在这种情况下不适用

1 个答案:

答案 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

我可能错过了一些东西,但它应该足以让你去。