如何在参数化函数中实现NSTimer?

时间:2013-03-18 04:10:45

标签: ios objective-c

我正在编写一个用于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];
}

请告诉我我的代码有什么问题,并告诉我是否有其他方法可用于该过程的示例。

提前致谢。

2 个答案:

答案 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的课程参考的链接。