2016-04-06 20 views
1

Uygulamam için oturum etkinliğini uygularım, böylece kullanıcı 30 saniye boyunca etkin değilse, onu bir form sayfası olarak yeni bir kullanıcı denetleyicisine gösterin. Dokunmatik olay için, ben konsoldaDokunuşlar objektif olarak iki kez fark edilir.

#import "BCDTimeManager.h" 

@implementation BCDTimeManager 

__strong static BCDTimeManager *sharedTimerInstance = nil; 

NSTimer *idleTimer; 
NSTimeInterval timeinterval; 
+ (BCDTimeManager*)sharedTimerInstance 
{ 
    static dispatch_once_t predicate = 0; 
    dispatch_once(&predicate, ^{ 
     sharedTimerInstance = [[self alloc] init]; 
     NSString *timeout = [[NSUserDefaults standardUserDefaults] valueForKey:@"session_timeout_preference"]; 
     timeinterval = [timeout doubleValue]; 

    }); 
    return sharedTimerInstance; 
} 

- (void)resetIdleTimer { 
    if (idleTimer) { 
     [idleTimer invalidate]; 
    } 

    idleTimer = nil; 
    NSLog(@"timeout is %ld",(long)timeinterval); 
    idleTimer = [NSTimer scheduledTimerWithTimeInterval:timeinterval target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:true]; 
} 

- (void)idleTimerExceeded { 
    NSLog(@"idle time exceeded"); 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"ApplicationTimeout" object:nil]; 
} 

Ama ekranlarda herhangi dokunuş yaptığınızda, ben uygulayan bir tekil sınıf resetIdleTimer ve idleTimerExceed yöntemidir BCDTimeManager sınıfında bu kodu

(void)sendEvent:(UIEvent *)event { 
    [super sendEvent:event]; 
    // Only want to reset the timer on a Began touch or an Ended touch, to reduce the number of timer resets. 
    NSSet *allTouches = [event allTouches]; 
    if ([allTouches count] > 0) { 
    // allTouches count only ever seems to be 1, so anyObject works here. 
    UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase; 
    if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded) { 
     [[BCDTimeManager sharedTimerInstance]resetIdleTimer]; 
    } 
    } 
} 

kullanıyorum NSLog'un NSNOtification eylemimin iki kez tetiklenmesine neden olan iki kez yazdırıldığını görebiliyorum.

Neyi yanlış yaptığımı bilmiyorum. Lütfen bunu anlamama yardım et.

+0

içine bakacağım '' 'resetIdleTimer''' '' '' idleTimer''' tanımlıyorsunuz? Bana öyle geliyor ki “idleTimer invalidate]' 'dediğinizde mevcut değil. – docksteaderluke

+0

IdleTimer'i tanımlamak için kodu güncelledim – Nitya

+0

Bir şey rootViewController'da NSNotification gözlemcisi ekliyorum ve kullanıcı oturumu kapattığında gözlemci kaldırıyorum. Gözlemcilerin düzgün bir şekilde kaldırılmaması ve bildirimin iki kez eklenmesine neden olması mümkündür. – Nitya

cevap

1

Bunu çözdüm. Kod doğru yapıyor. NSLog'u iki dokunuş olayı yüzünden iki kez görüyorum, bir dokunuş başladı ve bir dokunuş bitti. Yani, bu kod herhangi bir sorun olmadan doğrudur. Gözlemciler bir şey eklemek veya çıkarmak yöntemi ile yanlıştır.