我正在编写一个用于XML解析的程序。解析过程运行良好但我需要在每25秒后重复该功能。我试过NSTimer
,但它不适合我。调用它时会显示SIGABRT错误。我需要在每25秒后调用一次该函数,如下所示:
-(id)loadXMLByURL:(NSString *)filePath :(NSTimer *) timer
{
categories =[[NSMutableArray alloc]init];
NSData *myData = [NSData dataWithContentsOfFile:filePath];
parser =[[NSXMLParser alloc]initWithData:myData];
parser.delegate = self;
[parser parse];
return self;
}
我用来设置计时器的方法如下所示
- (void)viewDidLoad
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cd_catalog" ofType:@"xml"];
NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 25.0 target: self
selector: @selector(loadXMLByURL:filePath:) userInfo: nil repeats: YES];
xmlParser=[[XMLParser alloc] loadXMLByURL:filePath:myTimer];
[super viewDidLoad];
}
请告诉我我的代码有什么问题,并告诉我是否有其他方法可用于该过程的示例。
提前致谢。
答案 0 :(得分:2)
用于计时器的选择器只能接受一个参数,那将是计时器。您无法将filePath传递给计时器的选择器。
删除filePath参数并使路径成为实例变量。
-(id)loadXML {
categories =[[NSMutableArray alloc]init];
NSData *myData = [NSData dataWithContentsOfFile:filePath]; // filePath is an ivar
parser =[[NSXMLParser alloc]initWithData:myData];
parser.delegate = self;
[parser parse];
return self;
}
- (void)viewDidLoad {
// filePath is now an ivar
filePath = [[NSBundle mainBundle] pathForResource:@"cd_catalog" ofType:@"xml"];
// The timer isn't needed by the selector so don't pass it
NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval:25.0 target:self
selector:@selector(loadXML) userInfo:nil repeats:YES];
xmlParser=[[XMLParser alloc] loadXML];
[super viewDidLoad];
}
注意:您应该为每个参数命名。您的原始方法名为loadXMLByURL::
。注意两个冒号之间没有任何内容。
答案 1 :(得分:0)
我相信你的问题是你传递了选择器@selector(loadXMLByURL:filePath :),它有两个参数,但NSTimer的选择器必须只有一个参数,它是计时器本身。
来自NSTimer的文档:
aSelector
The message to send to target when the timer fires. The selector must correspond to a method that returns void and takes a single argument. The timer passes itself as the argument to this method.
您需要创建一个只有NSTimer *(或id)作为参数的方法,并从其他地方获取您的文件名。
编辑:以下是指向NSTimer的课程参考的链接。