2013-08-03 3 views
0

У меня есть NSTimer, который нужно запускать в фоновом режиме при перемещении по разным страницам, но когда у меня было это в файлах контроллера вида, id переместился на другую страницу, и это по существу уничтожить таймер. поэтому я сделал одноэлементный класс и попытался поместить туда код и просто называть его оттуда. на этом этапе выполняется код, но он не продолжает запускать таймер при переходе на другую страницу. любые идеи приветствуются, пожалуйста, обратитесь за дополнительной информацией!Запуск NSTimer в одноэлементном классе

Код: Viewcontroller.h

#import <UIKit/UIKit.h> 
#import "ApplicationManager.h" 
@interface ViewController : UIViewController{ 

IBOutlet UILabel *time; 
NSTimer *ticker; 
} 

- (IBAction)start; 
- (IBAction)reset; 


- (void)showActivity; 


@end 
// 
// ViewController.m 
// License 
// 
// Created by Connor Gosell on 7/2/13. 
// Copyright (c) 2013 Connor Gosell. All rights reserved. 
// 

#import "ViewController.h" 
#import "ApplicationManager.h" 
@interface ViewController() 

@end 

@implementation ViewController 

-(IBAction) start 
{ 
ticker:[NSTimer scheduledTimerWithTimeInterval:1.0 target:self   selector:@selector(showActivity) userInfo:nil repeats:YES]; 
} 

-(IBAction)reset 
{ 
[ticker invalidate]; 
time.text = @" 0:00"; 
} 

-(void) showActivity 
{ 
int currentTime = [time.text intValue]; 
int newTime = currentTime + 1; 
time.text = [NSString stringWithFormat:@"%d", newTime]; 
} 




- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

@end 
/*-(IBAction) start 
{ 
[[ApplicationManager instance] setTicker:[NSTimer scheduledTimerWithTimeInterval:1.0 target:self ``selector:@selector(showActivity) userInfo:nil repeats:YES]]; 
} 

-(IBAction) reset 
{ 
[[[ApplicationManager instance] ticker] invalidate]; 
time.text = @" 0:00"; 
} 

-(void) showActivity 
{ 
int currentTime = [time.text intValue]; 
int newTime = currentTime + 1; 
time.text = [NSString stringWithFormat:@"%d", newTime]; 
} 

*/ 


// 
// ApplicationManager.h 
// License 
// 
// Created by Connor Gosell on 7/31/13. 
// Copyright (c) 2013 Connor Gosell. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
@interface ApplicationManager : NSObject{ 

} 

+(ApplicationManager*) instance; 



@end 
// 
// ApplicationManager.m 
// License 
// 
// Created by Connor Gosell on 7/31/13. 
// Copyright (c) 2013 Connor Gosell. All rights reserved. 
// 
#import "ApplicationManager.h" 
@implementation ApplicationManager 
static ApplicationManager* appMgr = nil; 

+(ApplicationManager*) instance 
{ 
@synchronized([ApplicationManager class]) 
{ 
if(!appMgr) 
{ 
appMgr = [[self alloc] init]; 
} 

return appMgr; 
} 

return nil; 
} 

+(id) alloc 
{ 
@synchronized([ApplicationManager class]) 
{ 
    NSAssert((appMgr == nil), @"Only one instance of singleton class may be  instantiated."); 
appMgr = [super alloc]; 
return appMgr; 
} 
} 

-(id) init 
{ 
if(!(self = [super init])) 
{ 
    [self release]; 
    return nil; 
} 

return self; 
} 
+0

В вашем методе класса 'instance' вы никогда не доходите до конца синхронизированного блока, возврат должен находиться за пределами синхронизированного блока. – lucaslt89

+2

Непонятно, какой код вы используете сейчас. Вы сказали, что попробовали его в одноэлементном режиме, но введенный вами код показывает таймер в контроллере представления. – rdelmar

+0

@ lucaslt89 вы можете объяснить это еще немного? Я не понимаю синхронизированный блок или файл? .m или .h – Gosell1

ответ

0

Я буду делать некоторые предположения, но вы можете рассчитать время на основе системного времени, а не по инкрементируя вар. Время начала может быть сохранено как свойство в делетете приложения, если оно повторно используется всем приложением. Если время рассчитывается таким образом, таймеры могут запускаться, когда каждый контроллер вида появляется и останавливается при исчезновении, и может потребоваться более быстрый интервал, если будет желательна точность. Я использую подобный метод для этого в приложениях Pace Clock Mac и iOS.

0

Поместите таймер в свой AppDelegate, отметьте отметку таймера, отправьте уведомление, чтобы ваши контроллеры просмотра включали слушателя для уведомления, чтобы они могли выполнять свои обновления.

Смежные вопросы