Xcode 时间不会停止
可能重复:Xcode 时间不会停止,xcode,nstimer,Xcode,Nstimer,可能重复: 我很难停止我的计时器,巫婆ping到我的服务器。 我已经在这里和其他地方寻找了其他答案,但我似乎找不到哪里出了错 我决定用同样的想法制作一个示例代码,但是,你点击一个按钮计时器开始,你点击另一个按钮计时器结束,它按照它应该的方式工作。请不要介意我是否做错了什么(除了计时器部分),我是这方面的新手。我只想知道为什么它不会停止 提前谢谢 连接.h #import <Foundation/Foundation.h> @interface Connection : NSOb
我很难停止我的计时器,巫婆ping到我的服务器。 我已经在这里和其他地方寻找了其他答案,但我似乎找不到哪里出了错 我决定用同样的想法制作一个示例代码,但是,你点击一个按钮计时器开始,你点击另一个按钮计时器结束,它按照它应该的方式工作。请不要介意我是否做错了什么(除了计时器部分),我是这方面的新手。我只想知道为什么它不会停止 提前谢谢 连接.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
使用
[self timerStop]代码>使用点语法仅适用于属性(如果不使用,将生成警告),而不是以您正在执行的方式调用方法
编辑:这不会解决您的问题,但是按照您现在的方式进行操作是非常糟糕的编码实践。在timer中,您只需替换timer属性中的任何内容即可。如果启动第二个计时器而不停止第一个计时器,它将永远运行。因此,timerStart应该在创建新的timerStop之前先调用timerStop(然后可能会有一个新的名称,因为从timerStart调用timerStop是愚蠢的)。也许您应该澄清,更改不会产生任何影响。这可能是不好的编码实践,但结果将完全相同。谢谢,我在写这篇文章时学习了objective C,因此任何建设性的批评都是值得赞赏的。但至少从我的理解来看,我不是在创建一个新的。当用户登录时,authenticate方法启动计时器。当用户离开屏幕/注销时,viewDidUnload方法将调用logout,它将调用timerStop,终止我创建的最后一个(也是唯一一个)计时器,对吗?除非你
说通过设置self.timer属性,我实际上是在创建一个新的?好吧,我找到了罪魁祸首:在我的RootViewController中,我实例化了要登录的连接,但在同一个线程中,我释放了它。这个线程创建了计时器。但是,当我离开视图时,我需要销毁计时器,所以我创建了另一个连接实例,只是为了注销,然后立即释放它。所以你的建议在这里适用得很好,因为我创造了一个时间,但摧毁了另一个不存在的时间。
#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
-(void)timerStart
{
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ping:) userInfo:nil repeats:YES];
}