1

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

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

提前致谢。

4

2 回答 2

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::. 注意中间没有任何内容的两个冒号。

于 2013-03-18T04:17:22.700 回答
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类参考的链接。

于 2013-03-18T04:18:36.407 回答