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

タイマーに使用するセレクターは 1 つのパラメーターしか取ることができず、それがタイマーになります。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::. 間に何もない 2 つのコロンに注意してください。

于 2013-03-18T04:17:22.700 に答える
0

あなたの問題は、2 つのパラメーターを持つセレクター @selector(loadXMLByURL:filePath:) を渡していることだと思いますが、NSTimer のセレクターにはタイマー自体であるパラメーターが 1 つだけ必要です。

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 に答える