2011-08-23 7 views
1

가능한 복제를 중지합니다
NSTimer doesn't stopNSTimer 못해

을 내 서버에 내 타이머, 마녀 핑을 중지 힘든 시간을 보내고 있어요. 나는 이미 여기와 다른 곳에서 다른 해답을 찾았지만, 내가 잘못한 곳을 찾지 못한다.

동일한 아이디어로 예제 코드를 작성하기로 결정했지만 타이머를 시작하는 버튼을 클릭하고 다른 타이머를 클릭 한 다음 원하는대로 작동했습니다. 제발 내가 뭔가 잘못 (타이머 부분 이외의) 나는 이것에 새로운 해요 신경 쓰지 마세요. 내가 알고 싶은 건 왜 그만하지 않았을까 ..

미리 감사드립니다. 도트 구문을 사용하여

는 Connection.h

#import <Foundation/Foundation.h> 


@interface Connection : NSObject 
{ 
NSString *urlString; 
NSURL *url; 
NSMutableURLRequest *request; 
NSURLConnection *connection; 
NSURLResponse *response; 
NSMutableData *receivedData; 
NSData *responseData; 
NSError *error; 

NSTimer *timer; 
} 
@property (nonatomic, retain) NSTimer *timer; 

-(BOOL)authenticateUser:(NSString *)userName Password:(NSString *)password; 
-(BOOL)checkConnection; 
-(void)ping:(NSTimer *)aTimer; 
-(void)logout; 
-(void)timerStart; 
-(void)timerStop; 

@end 

Connection.m

#import "Connection.h" 
#import "Parser.h" 
#import "Reachability.h" 
#import "TBXML.h" 

@implementation Connection 

@synthesize timer; 

-(BOOL) authenticateUser:(NSString *)userName Password:(NSString *)password 
{ 
BOOL success; 
urlString = [[NSString alloc] initWithFormat:@"my/server/address/login"]; 
url =[[NSURL alloc] initWithString:urlString]; 
request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
error = [[NSError alloc] init]; 
responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
[responseData retain]; 
NSString *tempString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
NSMutableDictionary *tempDict= [[NSMutableDictionary alloc] init]; 
if (request) 
{ 
    Parser *parser = [[Parser alloc] init]; 
    tempDict = [parser readXMLString:tempString]; 
    for (id key in tempDict) 
    { 
     NSLog(@"%@ is %@",key,[tempDict objectForKey:key]); 
    } 
    if ([[tempDict objectForKey:@"login"] isEqualToString:@"true"]) 
    { 
     success = YES; 
      self.timerStart; 
    } 
    else 
    { 
     success = NO; 
    } 
} 
[urlString release]; 
[url release]; 
[error release]; 
[responseData release]; 
[tempString release]; 
return success; 
} 

-(void)logout 
{ 
    self.timerStop; 
} 

-(void)ping:(NSTimer *)aTimer; 
{ 
urlString = [[NSString alloc] initWithFormat:@"my/server/address"]; 
url =[[NSURL alloc] initWithString:urlString]; 
request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 

NSLog(@"ping"); 

[urlString release]; 
[url release]; 
} 

-(BOOL)checkConnection 
{ 
Reachability *reachability = [Reachability reachabilityWithHostName:@"http://my/server/address"]; 
NetworkStatus internetStatus = [reachability currentReachabilityStatus]; 

if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) 
{ 
    return NO; 
} 
else 
{ 
    return YES; 
} 
} 

-(void)timerStart 
{ 
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ping:) userInfo:nil repeats:YES]; 
} 
-(void)timerStop 
{ 
[self.timer invalidate]; 
self.timer = nil; 
} 


@end 

답변

2

. 첫 번째 타이머를 중지하지 않고 두 번째 타이머를 시작하면 타이머가 계속 실행됩니다. 그래서 timerStart는 먼저 새로운 것을 생성하기 전에 timerStop을 호출해야합니다 (그리고 아마도 새로운 이름을 가지고 있어야만합니다. 그러면 timerStart에서 timerStop을 호출하는 것이 어리석은 일입니다).

+0

하지만 적어도 이해하는 것으로부터 나는 새로운 것을 만들지 않습니다. 사용자가 로그인하면 authenticate 메소드가 타이머를 시작합니다. 사용자가 화면/로그 오프를 끝내면 viewDidUnload 메소드가 timerStop을 호출하여 마지막으로 생성 된 타이머를 종료하는 로그 아웃을 호출합니다. 맞습니까? self.timer 속성을 설정하여 실제로 새로운 것을 생성한다고 말하는 것이 아니라면? – Erakk

+0

좋아, 내가 범인을 찾았 : 내 RootViewController 있음, 내 연결을 인스턴스에, 로그인했지만 동일한 스레드에서 그것을 공개했다. 이 스레드는 타이머를 생성했습니다. 하지만 뷰를 떠날 때 타이머를 없애야 했으므로 로그 아웃하기 위해 또 다른 Connection 인스턴스를 만들었습니다. 그래서 당신의 충고가 잘 적용되었습니다, 왜냐하면 나는 시간을 창조했지만 존재하지 않았던 다른 것을 파괴했기 때문입니다. – Erakk

0

사용 [self timerStop]; 속성 만 (그리고 당신이하지 않으면 경고를 생성합니다) 메소드를 호출하지, 당신이하는 동안.

편집 : 이것은 당신의 문제를 해결하지만, 당신이하는 방법을 수행하지 않습니다 매우 나쁜 코딩 연습 그냥 타이머 속성에 무엇이든 교체 timerStart에서

+0

어쩌면 당신은 차이를 만들지 않는다는 것을 분명히해야합니다. 나쁜 코딩 연습일지도 모르지만 결과는 완전히 동일합니다. –

+0

예, 좋은 생각입니다. –

+0

고맙습니다. 나는이 글을 쓰면서 객관적인 C 언어를 배우므로 건설적인 비평을 부탁드립니다. – Erakk

0
-(void)timerStart 
{ 
    [self.timer invalidate]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ping:) userInfo:nil repeats:YES]; 
}