Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在参数化函数中实现NSTimer?_Ios_Objective C - Fatal编程技术网

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

Ios 如何在参数化函数中实现NSTimer?,ios,objective-c,Ios,Objective C,我正在编写一个XML解析程序。解析过程运行良好,但我需要在每25秒后重复该函数。我尝试了NSTimer,但它对我不起作用。当调用它时,它显示SIGABRT错误。下面给出了我需要在每25秒后调用的函数: -(id)loadXMLByURL:(NSString *)filePath :(NSTimer *) timer { categories =[[NSMutableArray alloc]init]; NSData *myData = [NSData dataWithConten

我正在编写一个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];
}
请告诉我我的代码有什么问题,并通过一个例子告诉我是否有其他方法可用于该过程


提前感谢。

您用于计时器的选择器只能接受一个参数,即计时器。无法将文件路径传递给计时器的选择器

删除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::
。请注意两个冒号之间没有任何内容。

我认为您的问题是您正在向其传递选择器@selector(loadXMLByURL:filePath:),该选择器有两个参数,但NSTimer的选择器必须只有一个参数,即计时器本身

从NSTimer上的文档:

a选择器
计时器启动时要发送到目标的消息。选择器必须对应于返回void并接受单个参数的方法。计时器将自身作为参数传递到此方法。

您需要创建一个仅使用NSTimer*(或id)作为参数的方法,并从其他地方获取文件名


编辑:这里有一个链接指向的类参考。

为什么你有
返回self在您的方法中?为什么要每25秒反复分析同一个文件?为什么不解析一次并保存数据?@rmaddy我相信XML文件将从远程来源提供,他将侦听文件中的更改或类似内容。我认为这是正确的答案。好奇的是,
loadXML
方法返回
self
有什么特别的原因吗?它不能仅仅是
(void)loadXML
?它可以是void。我相信他只是返回了self,因为这就是您在代码中所做的。@Jsdodgers感谢您的澄清。顺便说一句,不是我。@tolgamorf让
loadXML
return
self
对我来说毫无意义。如前所述,我之所以离开它,是因为出于某种原因。此外,您可以将filename参数作为userInfo参数传递:
[NSTimer scheduledTimerWithTimeInterval:25.0目标:自选择器:@selector(loadXML)userInfo:filename repeats:YES]
并通过
-userInfo
传入实例的方法在函数中检索它