가능한 복제를 중지합니다
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
하지만 적어도 이해하는 것으로부터 나는 새로운 것을 만들지 않습니다. 사용자가 로그인하면 authenticate 메소드가 타이머를 시작합니다. 사용자가 화면/로그 오프를 끝내면 viewDidUnload 메소드가 timerStop을 호출하여 마지막으로 생성 된 타이머를 종료하는 로그 아웃을 호출합니다. 맞습니까? self.timer 속성을 설정하여 실제로 새로운 것을 생성한다고 말하는 것이 아니라면? – Erakk
좋아, 내가 범인을 찾았 : 내 RootViewController 있음, 내 연결을 인스턴스에, 로그인했지만 동일한 스레드에서 그것을 공개했다. 이 스레드는 타이머를 생성했습니다. 하지만 뷰를 떠날 때 타이머를 없애야 했으므로 로그 아웃하기 위해 또 다른 Connection 인스턴스를 만들었습니다. 그래서 당신의 충고가 잘 적용되었습니다, 왜냐하면 나는 시간을 창조했지만 존재하지 않았던 다른 것을 파괴했기 때문입니다. – Erakk